C# を使用して XML ドキュメント内の特定の値を検索する良い方法は何ですか?
-
22-08-2019 - |
質問
Oracle によって公開されている WebService を呼び出しています。この WebService は、ItemID の入力を受け入れ、対応する項目番号を返します。応答に含まれる XML から返された項目番号を取得したいと考えています。
XML は次のようになります。
<env:Envelope
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns0="http://dev1/MyWebService1.wsdl">
<env:Header>
<wsse:Security
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
env:mustUnderstand="1"/>
</env:Header>
<env:Body>
<ns0:getItemNbrByItemIdResponseElement>
<ns0:result>1010603</ns0:result>
</ns0:getItemNbrByItemIdResponseElement>
</env:Body>
</env:Envelope>
のみを取得することに興味があります <ns0:result>1010603</ns0:result>
特に 1010603 のみ。
私は C# を使用して XML を解析する作業をあまり行ったことがなく、これまでのところいくつかの異なる方法を試しています。これを行うための推奨される方法は何ですか?
私はVS2008を使用しています(XPathが利用できるなど)
解決
私は個人的には、XMLにLINQを使用すると思います。あなたが好きな何かをしたい:
XNamespace ns0 = "http://dev1/MyWebService1.wsdl";
String result = doc.Descendants(ns0 + "result").First().Value;
ここdoc
注、 XDocument
になることが期待されますのないの XmlDocument
する 。 (私の推測では、それはあなたのために現れていなかった理由、これがあるということである。)
他のヒント
FWIW://*[local-name()='result']
あなたが値を取得するために、あなたがXPathDocumentオブジェクトを使用することができますLINQのために行くにしたくない場合:
XPathDocument xmldoc = new XPathDocument(@"C:\tmp\sample.xml");
XPathNavigator nav = xmldoc.CreateNavigator();
XmlNamespaceManager nsMgr = new XmlNamespaceManager(nav.NameTable);
nsMgr.AddNamespace("ns0", "http://dev1/MyWebService1.wsdl");
XPathNavigator result = nav.SelectSingleNode("//ns0:result", nsMgr);
System.Diagnostics.Debug.WriteLine(result.Value);
XPathDocumentオブジェクトは、低メモリフットプリントを持っており、最も可能性の高い高速化のXmlDocumentよりもあなたのシナリオです。 XPathDocumentオブジェクトは、それをしないのに対し、XmlDocumentオブジェクトは、メモリ内のXMLドキュメントの完全なオブジェクト・モデルを構築ます。
私の頭の上から、以下の作業をする必要があります:
XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
XmlNamespaceManager mgr = GetNamespace(doc);
doc.LoadXml(xmltext);
XmlNode nd = doc.DocumentElement.SelectSingleNode("//ns0:result", mgr);
名前空間のコードは次のようになります:
private XmlNamespaceManager GetNamespace(XmlDocument document)
{
XmlNamespaceManager mgr = new XmlNamespaceManager(document.NameTable);
mgr.AddNamespace("ns0", "http://dev1/MyWebService1.wsdl");
return mgr;
}
あなたは、XMLドキュメントは、それに関連付けられた名前空間を持っている、とXPathクエリ解像度でこれを使用しているため、名前空間マネージャを使用する必要があります。
これを解決するために、私はジョンスキートの答えを使用していました。ここで私は(他の誰の将来の利益のために)この作業を行うために実装しなければならなかったコードがあります。
XmlDocument xmlDoc = new XmlDocument();
XNamespace ns0 = "http://dev1/MyWebService1.wsdl";
xmlDoc.Load(request.GetResponse().GetResponseStream());
XDocument xDoc = XDocument.Load(new XmlNodeReader(xmlDoc));
String result = xDoc.Descendants(ns0 + "result").First().Value;
もちろんこれは私が戻ってのHttpWebRequestという名前のリクエストのからの私の応答を取得しています前提としています。
この質問に対する非常に優れた完全な答えがあります。
付け加えます 非常に単純な XPath 式が機能するという単なる好奇心からです。 この特定の場合:
normalize-space(/)
これは、以下の 2 行のようなコードを使用して C# で簡単に実行できます。
XPathNavigator navigator = document.CreateNavigator();
string res = (string)navigator.Evaluate("normalize-space(/)");
.NET XPath エンジンが適切に最適化されているため、その評価も効率的になる可能性があります。