【问题】
之前用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