【问题】
之前用C#代码处理xml时,如下xml的内容:
<BrowseNodeLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01"> ...... <BrowseNodes> <Request> <IsValid>True</IsValid> <BrowseNodeLookupRequest> <BrowseNodeId>2619525011</BrowseNodeId> <ResponseGroup>BrowseNodeInfo</ResponseGroup> </BrowseNodeLookupRequest> </Request> <BrowseNode> <BrowseNodeId>2619525011</BrowseNodeId> <Name>Appliances</Name> <Children> <BrowseNode> <BrowseNodeId>2619526011</BrowseNodeId> <Name>Categories</Name> <IsCategoryRoot>1</IsCategoryRoot> </BrowseNode> <BrowseNode> <BrowseNodeId>2645269011</BrowseNodeId> <Name>Featured Categories</Name> </BrowseNode> <BrowseNode> <BrowseNodeId>2645372011</BrowseNodeId> <Name>Self Service</Name> </BrowseNode> </Children> </BrowseNode> </BrowseNodes> </BrowseNodeLookupResponse>
C#处理的话,正常的话,必须加上对应的namespace的,才能找到对应的节点:
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("ams", awsNamespace); XmlNode browseNodesNode = doc.SelectSingleNode("/ams:BrowseNodeLookupResponse/ams:BrowseNodes", nsmgr);
很明显,对于,确保xml中只有一个namespace时,每次使用SelectSingleNode,都要加个对应的ams:
真是烦都烦死了,用起来不是一般的麻烦。
所以,希望可以:
不用每次使用SelectSingleNode等函数时,都必须加上那个烦人的namespace前缀和XmlNamespaceManager
希望直接用:
XmlNode browseNodesNode = doc.SelectSingleNode("/BrowseNodeLookupResponse/BrowseNodes");
即可。
【解决过程】
1.参考:
去用如下代码试试:
XmlNamespaceManager xnm = new XmlNamespaceManager(doc.NameTable); xnm.RemoveNamespace("BrowseNodeLookupResponse", awsNamespace); XmlNode browseNodesNode = doc.SelectSingleNode("/BrowseNodeLookupResponse");
结果不行,browseNodesNode是null。
所以还是必须用namespace才行的。
2.后来自己折腾,最后使用暴力去除xmlns的办法:
string xmlnsStr = " xmlns=\"" + awsNamespace + "\""; //"http://webservices.amazon.com/AWSECommerceService/2011-08-01" string xmlNoNs = respHtml.Replace(xmlnsStr, ""); XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlNoNs); XmlNode browseNodesNode = doc.SelectSingleNode("/BrowseNodeLookupResponse/BrowseNodes");
即,先去除:
xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01" |
然后再继续处理
就可以避免xmlns的骚扰了。
3.后来,也在别处:
看到类似的做法,也只是暴力的去除xmlns而已,只是用的正则。
此处为了减少误判断,所以还是精确的去除xmlns比较靠谱。
当然为了简单处理,还是正则效率高。
【总结】
xmlns,本身的确是有存在的必要的,比如:
Why is XmlNamespaceManager necessary?
中所讨论的。
但是很明显,对于多数时候,问题明显是可以简化的,为何xml规范,或者微软的API,就不能提供更简单的做法呢???
真是很不人性化。。。
转载请注明:在路上 » 【已解决】C#处理xml中,希望去除或不用namespace,即不用XmlNamespaceManager