3

命名空间和 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。我已经尝试了一些不同的变体,但没有任何效果。我不明白什么?

4

2 回答 2

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;
于 2012-08-01T05:08:40.210 回答
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();
于 2012-08-01T05:04:32.220 回答