1

私には正しいように見えるXPathクエリがありますが、結果が返されません。

テスト対象のXMLドキュメント:

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Deployment.Parts>
    <AssemblyPart x:Name="foo" Source="foo.dll" />
  </Deployment.Parts>
</Deployment>

コード:

Xml = new XmlDocument();
Xml.LoadXml(text);
Manager = new XmlNamespaceManager(Xml.NameTable);
//use constants for namespaces to make more readable
Manager.AddNamespace("a", NS_DEPLOYMENT_2007); //use 'a' for default namespace here so xpath is easier
Manager.AddNamespace("x", NS_XAML_2006); 

string xpath="//a:Deployment.Parts/a:AssemblyPart[@a:Source='foo.dll']";
var tmp = Xml.SelectNodes(xpath, Manager);

ここでのXPathクエリの何が問題になっていますか?

4

2 に答える 2

3

属性から名前空間プレフィックスを削除する必要があります。

string xpath="//a:Deployment.Parts/a:AssemblyPart[@Source='foo.dll']";

属性に名前空間が明示的に定義されている場合にのみ、属性の名前空間を指定する必要があるため、属性を照会するName場合は、次のように追加する必要があります。

string xpath="//a:Deployment.Parts/a:AssemblyPart[@x:Name='foo']";
于 2013-02-07T16:11:31.283 に答える
1

この部分があなたの問題と思います:

@a:Source='foo.dll'

要素名とは異なり、属性名は名前空間を継承しません。あなたのドキュメントは属性の名前空間を指定していないので、あなたもそうすべきではないと思います。

試してみてください:

@Source='foo.dll'

(余談ですが、私は個人的にXPathの代わりにLINQ to XMLを使用します-一般的に簡単だと思います。YMMVですが、もちろん.NET 3.5以降を使用している場合は検討する価値があります。)

XML1.0(第3版)の名前空間」セクション6.2(私の強調)から:

デフォルトの名前空間宣言のスコープは、内部のデフォルトの名前空間宣言のスコープを除いて、それが表示される開始タグの先頭から対応する終了タグの末尾まで拡張されます。空のタグの場合、スコープはタグ自体です。

デフォルトの名前空間宣言は、スコープ内の接頭辞のないすべての要素名に適用されます。デフォルトの名前空間宣言は、属性名に直接適用されません。接頭辞のない属性の解釈は、それらが表示される要素によって決定されます。

于 2013-02-07T16:11:22.537 に答える