2012-02-27 15 views
10

XML文書から特定の要素を取得するXPathクエリ/文字列を作成しようとしています。私はid = 38で要素をつかむことを試みていますが、私のコードは何らかの理由で何も返されません。XPath特定のid値を持つ要素を取得する文字列

私のコード&を見ると、私のXMLファイルの構成は、id = 38で要素をつかむために必要なXPathを教えていただけますか?

私のコードは次のとおりです。

XmlDocument xdoc = new XmlDocument(); 
xdoc.Load(getProductURL()); 
XmlNode node = xdoc.DocumentElement.SelectSingleNode("id('38')"); 

// node always is null for some reason? 

XMLが編成されている方法はそうのようなものです:

<courseg> 
    <group isempty="False" isbranch="true" id="1" name="abc"> 
     <group isempty="False" isbranch="true" id="38" name="def"></group> 
    </group> 
</courseg> 

答えて

19

必要なXPathはここ

//*[@id='38'] 

であることと一例ですXドキュメント:

 XDocument xdoc = XDocument.Parse(@" 
<courseg> 
    <group isempty=""False"" isbranch=""true"" id=""1"" name=""abc""> 
     <group isempty=""False"" isbranch=""true"" id=""38"" name=""def""></group> 
    </group> 
</courseg>"); 
     XElement node = xdoc.Root.XPathSelectElement("//*[@id='38']"); 
     Console.WriteLine(node); 
3

使用このXPathクエリ:それはid属性を持つすべてのノードを選択

//*[@id = 38] 

38に等しいです。あなたはより具体的でなければならない場合、すなわち使用し、id属性を持つgroup38に等しい選択し、この1:

//group[@id = 38] 
-1

あなたは

xdoc.DocumentElement.SelectSingleNode("id('38')" 

は、あなたの中の子ノードを検索するためのXmlDocumentを求めているに言及名前が 'id'のルートノード。しかし理想的には、「id」はxmlnodeではなく属性です。

ですから、38

+0

間違っています。これはid()関数の動作ではありません。 –

5

機能ID(「P38」)の値を持つ名前を「グループ」と属性「ID」を持つすべての子ノードを取得するために//group[@id = '38']を使用する必要がありますが、ID値を持つ要素を選択することになりますP38のしかし、これは単に「id」という名前の属性を意味するものではありません。これは、DTDまたはスキーマでタイプIDとして宣言された属性を意味します。あなたはDTDやスキーマを表示していませんが、私はあなたがそれを持っていないと考えています。 IDの値をすべて数字にすることはできません(従来のSGMLの理由から、名前の形式をとる必要があります)。

実際には、パフォーマンス要件が厳しい場合を除き、id()関数はおそらく避けてください。それはあまりにも脆弱です。スキーマまたはDTDに対してソースドキュメントを検証する場合にのみ機能します。 XSLTでは、代わりにkey()を使用します。代わりに、多くのプロセッサは、スキーマやDTDを参照せずに属性名xml:idを「自己宣言型」のID値として認識します。プロセッサがサポートしている場合は、その値を使用します。

関連する問題