1

以下は、.xml ファイルのスニペットです。私は次のことをしました:

Document doc = docBuilder.parse(filesInDirectory.get(i));
doc.getDocumentElement().normalize();
XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression expr1 = xPath.compile("//codes[@ class ='class2']/code[@code]");
Object result1 = expr1.evaluate(doc, XPathConstants.NODESET);
NodeList nodes1 = (NodeList) result1;   

今、

System.out.println("result length"+":"+nodes1.getLength());
returns 2.

(疑似コード) のように、属性名に基づいて論理的な決定を行いたい

 if(nodes1.contains(123))

また

if(nodes1.contains(123) && nodes1.contains(456))
   and make decision.

どうすればいいですか?

<metadata>
   <codes class="class1">
     <code code="ABC">
         <detail "blah" "blah">
     </code>
  </codes>
  <codes class="class2">
    <code code="123">
        <detail "blah blah"/>
    </code>
    <code code="456">
        <detail "blah blah"/>
    </code>
  </codes>
 </metadata>
4

3 に答える 3

2

これ:

XPathExpression expr1 = xPath.compile("//codes[@class]");
Object result1 = expr1.evaluate(doc, XPathConstants.NODESET);
NodeList nodes1 = (NodeList) result1; 

class属性を持つ要素のリストを返す必要があります。このノード リストを反復処理し、foreachノードを抽出して[@code]要素を抽出し、次のようなチェックを使用します。

if (node.getNodeValue().equals("123"))

ノードが探している値を持っているかどうかを確認します。

于 2012-07-29T20:13:44.727 に答える
1

これを試してください:

        File f = new File("test.xml");
        XPathFactory factory = XPathFactory.newInstance();
        XPath xpath = factory.newXPath();
        InputSource src = new InputSource(new FileInputStream(f));
        Object result = xpath.evaluate("//codes[@class='class2']/code/@code",src,XPathConstants.NODESET);
        NodeList lst = (NodeList)result;

        List<String> codeList = new ArrayList<String>();
        for(int idx=0; idx<lst.getLength(); idx++){
            codeList.add(lst.item(idx).getNodeValue());
        }
        if(codeList.contains("123")){
            System.out.println("123");
        }

        if(codeList.contains("123") && codeList.contains("456")){
            System.out.println("123 and 456");
        }

説明:

XPathは、 class as を持つすべての値//codes[@class='class2']/code/@codeを収集します。その後、メソッドを使用できるようにfromを構築できます。codecodesclass2ListNodeListcontains()

于 2012-07-30T07:54:49.443 に答える
1

次の XPath 式を使用します

/*/codes[@class]/code[@code = '123' or @code = '456']

属性の文字列値が文字列orのいずれかであり、その (要素) が`class 属性を持つ要素の子であり、XML ドキュメントの最上位要素の子である要素をcode選択します。code"123""456"codecodes

XSLT ベースの検証:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <xsl:copy-of select=
  "/*/codes[@class]/code[@code = '123' or @code = '456']"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると (整形式になるように修正されます):

<metadata>
    <codes class="class1">
        <code code="ABC">
            <detail/>
        </code>
    </codes>
    <codes class="class2">
        <code code="123">
            <detail />
        </code>
        <code code="456">
            <detail />
        </code>
    </codes>
</metadata>

XPath 式が評価され、選択されたノードが出力にコピーされます。

<code code="123">
   <detail/>
</code>
<code code="456">
   <detail/>
</code>

説明:

標準の XPath 演算子の適切な使用or

于 2012-07-29T22:57:33.410 に答える