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 namespacesperfix がないためです。

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 に答える