如何使用c#从xml获取节点 - 我做错了什么?

时间:2012-08-01 04:53:53

标签: c# xml soap

命名空间和XML仍然让我感到困惑。

这是我的XML(来自SOAP请求)

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <MyResponse xmlns="http://tempuri.org/">
         <OutputXML xmlns="http://tempuri.org/XMLSchema.xsd">
            <Result>
               <OutputXML>
                  <Result>
                     <Foo>
                        <Bar />
                     </Foo>
                  </Result>
               </OutputXML>
            </Result>
         </OutputXML>
      </MyResponse>
   </soap:Body>
</soap:Envelope>

我试图从SOAP响应中提取实际的XML部分(从Foo元素开始):

var nsmgr = new XmlNamespaceManager(document.NameTable);
nsmgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
nsmgr.AddNamespace("", "http://tempuri.org/");
nsmgr.AddNamespace("", "http://tempuri.org/XMLSchema.xsd");

var xml = document.DocumentElement
    .SelectSingleNode("Foo", nsmgr)
    .InnerXml;

但SelectSingleNode返回null。我已经尝试了一些不同的变化,但无法使任何工作。我不理解的是什么?

2 个答案:

答案 0 :(得分:8)

试试这个:

var nsmgr = new XmlNamespaceManager(document.NameTable);
nsmgr.AddNamespace("aaa", "http://tempuri.org/XMLSchema.xsd");

var xml = document.DocumentElement
    .SelectSingleNode("aaa:Foo", nsmgr)
    .InnerXml;

这是因为Default namespaces没有前缀。

您可以使用GetElementsByTagName直接使用名称空间uri:

var xml = document.GetElementsByTagName("Foo", 
             "http://tempuri.org/XMLSchema.xsd")[0].InnerXml;

答案 1 :(得分:3)

您可以使用LINQ to XML来获取结果,也可以指定命名空间

XDocument document = XDocument.Load("test.xml");
XNamespace ns = "http://tempuri.org/XMLSchema.xsd";
var test = document.Descendants(ns + "Foo").FirstOrDefault();

或者,如果您不想指定NameSpace,那么:

var test2 = document.Descendants()
                    .Where(a => a.Name.LocalName == "Foo")
                    .FirstOrDefault();