【已解决】C#处理xml中,希望去除或不用namespace,即不用XmlNamespaceManager

【问题】

之前用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.参考:

removing namespace from xml

去用如下代码试试:

        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.后来,也在别处:

XDocument remove namespace

看到类似的做法,也只是暴力的去除xmlns而已,只是用的正则。

此处为了减少误判断,所以还是精确的去除xmlns比较靠谱。

当然为了简单处理,还是正则效率高。

 

【总结】

xmlns,本身的确是有存在的必要的,比如:

Why is XmlNamespaceManager necessary?

中所讨论的。

但是很明显,对于多数时候,问题明显是可以简化的,为何xml规范,或者微软的API,就不能提供更简单的做法呢???

真是很不人性化。。。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量