2016-04-23 11 views
2

でこの属性のノードと戻り値の厳密に1つの属性が存在する場合、私は属性IDが存在するかどうかを確認したいと思いますし、それがこの例のXMLファイルの空でない場合:チェックXPATH

<component 
    id="http://../EDYRA/prototype/TextEditor" 
    isUI="true" 
    name="TextEditor" 
    version="0.1"> 
    <binding> 
     <dependencies> 
      <dependency language="javascript"> 
       <url>https://../TextEditor.js</url> 
      </dependency> 
     </dependencies> 
     <constructor> 
      <code>new TextEditor();</code> 
     </constructor> 
    </binding> 
</component> 

私が持っていますJavaでこのXPathクエリを書いた:

XPathExpression expr = xpath.compile("//component[@id]/@id/text()"); 
Object result = expr.evaluate(file, XPathConstants.NODESET); 
NodeList nodes = (NodeList) result; 

resultsString += "Expression: //component[@id]/@id/text(); 
resultsString += " \r\nNode List: " + result.toString() + " \r\n Item: "; 
resultsString += nodes.item(0) + " \r\n Length: "; 
resultsString += nodes.getLength() + " \r\n\r\n\r\n"; 

file.getDocumentElement(); 
resultsString += "Attribute ->" + " : " + file.getDocumentElement().getAttribute("id"); 

私はそれをテストしていると、残念ながら、それは0項目にリストを返します:

式://コンポーネント[@id]/@のID /テキスト()

ノードリスト:[email protected]

アイテム:ヌル

長さ:0

属性 - >http://../EDYRA/prototype/TextEditor

この属性が存在するかどうかをチェックしてこの属性の値を取得するには、正しい照会をどのように見なければなりませんか?

編集:

//コンポーネント[@id]も何の結果を返しません。 ...

+0

text()に属性を付けることはできません。そのようなxp​​ath 'string(// component [@id]/@ id)'を使用してください。 – splash58

+0

確かに、//コンポーネント[@id]/@ id'で属性を取り、プログラム言語で値を取ることができますが、Javaでそれを助けることはできません – splash58

+0

ノードリストの長さ0を返す – Beacze

答えて

1

また、text()アクセスを省略すると、@ idに2回アクセスする必要はありません。式//component/@idは、正確に//component[@id]/@idに相当します。この属性を持つすべてのコンポーネントの@id属性を返します。

@id属性が空でない場合にのみ返す場合は、//component/@id[string()]を試してください。

//component/@idが何も返されない場合は、あなたが私たちに語っていないことがあります。おそらくコンポーネント要素が名前空間にありますか?

+0

私のファイルのルートノードであるコンポーネント要素の前に、私は持っている:<?xml version = "1.0" encoding = "UTF-8"?>。すべてのXPathクエリが何も返さないうちに、コードの他の場所で間違いを犯したと思うかもしれません。 – Beacze

+0

yep、それは名前空間で問題でした – Beacze

2

//component[@id]/@id/text()

すべてのクエリの戻り何も属性が子ノードを持たないことはできませんが、上記の式では、任意選択id属性のすべてのテキストノードの子を選択するように見えます。この不正確な式は常にゼロノードを選択します。

XML文書内のすべてのcomponent要素の(値を持つ)すべてのidの属性を選択し、一つのXPath式は次のとおりです。

あなたも「空」として、ホワイトスペースのみの値を考える場合には
//component/@id[string()] 

//component/@id[normalize-space()]