诡异的命名空间问题

在处理XML文档的时候,一定要注意,有一个很诡异的问题,就是如果你的元素是含有默认命名空间的,则不仅仅是要添加XmlNamespaceManager,还要特别注意处理默认命名空间的问题。

下面是一个例子

例如我们要解析下面这一段XML文本,获取里面的SessionId

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header>
  <Session xmlns="urn:schemas-microsoft-com:xml-analysis" SessionId="A41A11A7-3EEC-443D-8383-E6F1428E555C"/>
</soap:Header><soap:Body><ExecuteResponse xmlns="urn:schemas-microsoft-com:xml-analysis"><return><root xmlns="urn:schemas-microsoft-com:xml-analysis:empty"/></return></ExecuteResponse></soap:Body></soap:Envelope>

代码应该这样写

private string GetSessionId(string response)
{
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(response);
    XmlNamespaceManager xnm = new XmlNamespaceManager(doc.NameTable);
    xnm.AddNamespace("k", "urn:schemas-microsoft-com:xml-analysis");
    xnm.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");

    XmlNode node = doc.SelectSingleNode("/soap:Envelope/soap:Header/k:Session", xnm);
    return node.Attributes["SessionId"].Value;
}

如果不加那个k前缀,就出错了,说找不到对象。这实在是有些弱智

 

而如果你用LINQ TO XML的话

XDocument doc = XDocument.Load(new StringReader(response));
            XNamespace name = "http://schemas.xmlsoap.org/soap/envelope/";
            XNamespace empty = "urn:schemas-microsoft-com:xml-analysis";
            return doc.Element(name + "Envelope").Element(name + "Header").Element(empty+"Session").Attribute("SessionId").Value;

 

我再次立场坚定地鄙视一下XML文档中加入命名空间这个设计,凭空添加了很多麻烦,而实际上的好处却不多

本文由作者:陈希章 于 2009/6/25 8:53:48 发布在:http://www.cnblogs.com/chenxizhang/
本文版权归作者所有,可以转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多博客文章,以及作者对于博客引用方面的完整声明以及合作方面的政策,请参考以下站点:陈希章的博客中心
posted @ 2009-06-25 08:54  陈希章  阅读(701)  评论(1编辑  收藏  举报