プレフィックスのないデフォルトの名前空間で XPath を使用するにはどうすればいいですか? 質問する

プレフィックスのないデフォルトの名前空間で XPath を使用するにはどうすればいいですか? 質問する

このドキュメントからすべての MyNodes を照会するための XPath (重要であれば、C# API の XDocument.XPathSelectElements(xpath, nsman)) は何ですか?

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <MyNode xmlns="lcmp" attr="true">
    <subnode />
  </MyNode>
</configuration>
  • /configuration/MyNode名前空間を無視するので、これは間違っています。
  • 試してみましたが、これはプレフィックスではなく URI なので/configuration/lcmp:MyNode間違っています。lcmp
  • 試してみた/configuration/{lcmp}MyNodeが失敗したAdditional information: '/configuration/{lcmp}MyNode' has an invalid token.

mgr.AddNamespace("df", "lcmp");編集:一部の回答者が提案したようには使用できません。そのためには、XML 解析プログラムが、使用予定の名前空間をすべて事前に認識している必要があります。これはどのソース ファイルにも適用できることを意図しているため、どの名前空間に手動でプレフィックスを追加すればよいのかわかりません。XPath{my uri}構文のようですが、Microsoft はそれを実装しませんでした... 本当ですか?

ベストアンサー1

要素configurationは名前のない名前空間にあり、MyNode はlcmp名前空間プレフィックスなしの名前空間にバインドされています。

これパスMyNodeステートメントを使用すると、名前空間を宣言せずに要素をアドレス指定したりlcmp、XPATH で名前空間プレフィックスを使用したりできます。

/configuration/*[namespace-uri()='lcmp' and local-name()='MyNode']

これは、子である任意の要素と一致しconfiguration、述語フィルタを使用してnamespace-uri()そしてlocal-name()要素に制限する機能ですMyNode

要素にどの名前空間URIが使用されるかわからない場合は、パスより汎用的で、単に一致するだけですlocal-name():

/configuration/*[local-name()='MyNode']

ただし、同じ名前を使用する異なるボキャブラリ (異なる名前空間 URI にバインドされている) 内の異なる要素が一致するリスクがあります。

おすすめ記事