2011-01-19 10 views
2

たとえば、XmlDocumentから選択する場合。 XPathメソッドSelectSingleNode最初に一致するノードからなるXmlNodeを取得します。<ノード1 >を呼び出します。 <node1>をさらに選択すると、XPath-rootがこのノードであることが予想されますが、これは正しくありません。ルートは元のXmlDocumentと同じままです。ここでは例です:XmlDocumentのXPathルートを.net(C#)に変更しますか?

XmlDocument xd = new XmlDocument(); 
xd.LoadXml(@"<root> 
       <subroot> 
        <elm>test1</elm> 
        <elm>test2</elm> 
        <elm>test3</elm> 
       </subroot> 
      </root>"); 
XmlNode xnSubRoot = xd.SelectSingleNode("/root/subroot"); 

//This is the XPath I want to be able to use, but it returns null. 
XmlNode xnElm = xnSubRoot.SelectSingleNode("/subroot/elm"); 

//This works, but the XPath-root is the same as in the original document. 
xnElm = xnSubRoot.SelectSingleNode("/root/subroot/elm"); 

は、私は私が欲しいのXPathを使用できるようにxnSubRootのルートを「修正」する方法はありますか?私の質問の理由は、OuterXmlプロパティが「/ Data/SubElement/...」の構造を示すXmlNodeを返すWebサービスを呼び出すケースがあるためですが、XPathを実行すると "/Data "の場合、nullが返され、"/SubElement "のみが動作します。つまり、XPathルートは実際のドキュメントルートより1レベル低いようです。

これについては完全に合理的な説明があること、または私は何かが欠けていると確信しています。しかし、私はhttp://msdn.microsoft.com/en-us/library/d271ytdx(VS.80).aspxを読んでも、本当に何かを見つけることができないようです。

N.B.私はXPath "// subroot/elm"を使用することが可能であることを認識していますが、XML構造内で他の要素をさらに下に置くこともあります。

答えて

2

Root/SubElementからあなたの選択は、これを試してみてくださいので:

XmlNode xnElm = xnSubRoot.SelectSingleNode("elm"); 

それは、現在のノードの最初の子elmノードを返します。

編集(コメントで提供additionalsの情報から):この特定のケースで

、あなたがobtaningているXmlNode Webサービス呼び出しから(自分のデータノードです)。その上にあるすべてのXPathリクエストは、それに関連しています。XmlNode

webServiceNode.SelectSingleNode("SubElement/SubSubElement");のようなセレクタを使用するようにすべてのXPathを変更することをお勧めします。ここで絶対XPathクエリを指定する理由はありません。

+0

は、おかげで、それは私が与えた例に来るとき、あなたは当然の権利です。しかし、XPath-rootが実際にドキュメントルートよりも低いのはどうでしょうか?どのようにすることができるかはわかりませんが、Webサービスから受け取ったXMLNodeの場合はそうです。 –

+0

WebサービスXMLのサンプルを提供できますか? –

+0

VS2005で「Web参照の追加」機能を使用して、Webサービスを呼び出すためのコードを自動生成しました。このコードは、object []を返すSystem.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(string、object [])を呼び出し、オブジェクト[0]をXmlNodeに明示的に型キャストします。 XMLに関しては申し訳ありませんがここには表示できませんが、文書構造は<! - その他の要素 - >です。しかし、予想される/ Data(すなわちSelectSingleNode( "/ Data")はnullを返しますが、SelectSingleNode( "/ SubElement")は機能します)ではなく、ルートが/ SubElementであるXPathを実行しています。 –

2

これは動作します:

XmlNode xnSubRoot = xd.SelectSingleNode("/root/subroot"); 
XmlNode xnElm = xnSubRoot.SelectSingleNode("elm"); 

だからこの行います

XmlNode xnRoot = xd.SelectSingleNode("/root"); 
XmlNode xnElm = xnRoot.SelectSingleNode("subroot/elm"); 
+0

ありがとう、あなたが当然のことながら、私が与えた例になります。しかし、XPath-rootが実際にドキュメントルートよりも低いのはどうでしょうか?どのようにすることができるかはわかりませんが、Webサービスから受け取ったXMLNodeの場合はそうです。 –

+0

受信したXmlNodeに親ノードがなく、表示されている動作が原因です。各ノードは、InnerXmlプロパティで示される構造体でのみ動作します。あなたの例で同じことを達成したいなら、 'xnSubRoot = xnSubRoot.CloneNode(true)'を実行することができます。それは最善の解決策ではないかもしれませんが、少なくともそれはうまくいくようです。それでも、ルートに基づいたXPathクエリ(つまり、 '/'で始まるクエリ)を使用する理由は何ですか? – mgronber