web-dev-qa-db-ja.com

XPathで属性名前空間によって要素を見つける方法

XPathを使用して、特定の名前空間に要素を持つすべての要素を検索しようとしています。

たとえば、次のドキュメントでは、foo:bar要素とdoodah要素を見つけたいと思います。

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:foo="http://foo.example.com">
  <foo:bar quux="value">Content</foo:bar>
  <widget>Content</widget>
  <doodah foo:quux="value">Content</doodah>
</root>

次のXPath式を使用して、特定の名前空間からすべての属性をロードできることを知っています。

"//@*[namespace-uri()='http://foo.example.com']"

しかしながら:

  • これは私に要素を与えるのではなく、属性だけを与えます。
  • 要素にその名前空間の複数の属性が含まれている場合、このセレクターは要素ごとではなく属性ごとの結果を返します

必要なものを取得することは可能ですか、それとも属性を収集して、それらが対応する要素の一意のセットを計算する必要がありますか?

21
Gareth

使用する:

//*[namespace-uri()='yourNamespaceURI-here'
   or
    @*[namespace-uri()='yourNamespaceURI-here']
   ]

述語2つの条件は、XPath or演算子で順序付けられます。

したがって、XPath式は、次のいずれかの要素を選択します。

  • 指定された名前空間に属します。
  • 指定された名前空間に属する属性があります。
27

これが何を意味するのかはわかりませんが、XPathで1つの文字を削除するだけで、特定の名前空間のすべての要素を取得できます。

//*[namespace-uri()='http://foo.example.com']
4
jor

あなたは試すことができます

//*[namespace-uri()='http://foo.example.com' or @*[namespace-uri()='http://foo.example.com']]

要素foo:barと要素doodahを提供します(XMLデータでtal:quuxfoo:quuxに変更した場合):

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:foo="http://foo.example.com" xmlns:tal="xxx">
  <foo:bar quux="value">Content</foo:bar>
  <widget>Content</widget>
  <doodah foo:quux="value">Content</doodah>
</root>

それはあなたが望むものですか?

1
Johannes Weiss

XPath式はほぼ完璧です。属性を要求する代わりに "@ "要素を要求する ""そしてそれは機能するはずです:

"//*[namespace-uri()='http://foo.example.com']"
0
potyl