-1

以下の例では、file.xmlと言います。タグ内に値がありますreturn code=""内部に<Port name="write_qwe">のみ値が必要です。

<Main display="NORMAL">
    <Port name="read_abc" exe="NO">
        <input>
            <struct file="C:\temp" sign="id1"/>
        </input>
        <output>
            <return code="33" shortmsg="Implementation not found for commande."/>
        </output>
    </Port>
    <Port name="write_qwe" exe="NO">
        <input>
            <struct file="C:\temp" id="id1"/>
        </input>
        <output>
            <return code="1" shortmsg="NOTEXECUTED" longmsg="Not execute due to previous error"/>
        </output>
    </Port>
    <Port name="read_abc" exe="NO">
        <input>
            <struct file="C:\temp" sign="id2"/>
        </input>
        <output>
            <return code="66" shortmsg="Implementation"/>
        </output>
    </Port>
    <Port name="write_qwe" exe="NO">
        <input>
            <struct file="C:\temp" id="id2"/>
        </input>
        <output>
            <return code="0" shortmsg="NOTEXECUTED" />
        </output>
    </Port>
</Main>

<return code" "> 内側 <port name="write_*"> と内側 にあるの値を取得する必要があります <output>。この例では、値「1」と「0」を取得する必要があります。

4

3 に答える 3

2

XPath はおそらくここに行く方法です。

xml ファイルをリソースとして配置しましたが、ファイル構造になっている可能性があります。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
ClassLoader loader = XmlTestReader.class.getClassLoader();
InputStream is = loader.getResourceAsStream("test.xml");
Document doc = builder.parse(is);

次に、XPath 式を作成します。

XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
XPathExpression expr = xPath.compile("/Main/Port[@name='write_qwe']/output/return/@code");
NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);

XPath 式は、の属性がである/Main/Port[@name='write_qwe']/output/return/@codeすべての属性を検索しcodeます。Portnamewrite_qwe

これで、次のようにノードを反復処理できます。

for (int i = 0; i < nl.getLength(); i++) {
    Node node = nl.item(i);
    System.out.println(node.getNodeValue());
}

代わりにノード/Main/Port[@name='write_qwe']/output/return全体が必要な場合は、XPath を制限できます。<return>

代わりに、次のように繰り返します。

for (int i = 0; i < nl.getLength(); i++) {
    Node node = nl.item(i);
    System.out.println(node.getAttributes().getNamedItem("code").getNodeValue());
}

編集

Blaise Doughanのコメントで示唆されているように、代わりにas input を使用することをお勧めします。InputSourceXPathExpression#evaluate()

ClassLoader loader = XmlTestReader.class.getClassLoader();
InputStream inputStream = loader.getResourceAsStream("test.xml");
InputSource inputSource = new InputSource(inputStream);

XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
XPathExpression expr = xPath.compile("/Main/Port[@name='write_qwe']/output/return/@code");
NodeList nl = (NodeList) expr.evaluate(inputSource , XPathConstants.NODESET);
于 2012-08-29T08:20:01.780 に答える
2

xpath の使用に問題がない場合は、これを試すことができます。

引数に xml ファイルのパスを指定する必要があります。

   XPathReader reader = new XPathReader("FileName.xml");

   // To get a xml attribute.
   String expression = "/Main/Port/output/@code";

   System.out.println(reader.read(expression,XPathConstants.STRING) + "n");
于 2012-08-29T07:06:38.440 に答える
0

XML が文字列の場合、次のことができます。

String xml = ""; //Populated XML String....
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = DocumentBuilderFactory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(xml)));
Element rootElement = document.getDocumentElement();

XML がファイル内にある場合、Document ドキュメントは次のようにインスタンス化されます。

Document document = builder.parse(new File("file.xml"));

は、ドキュメントのdocument.getDocumentElement()ドキュメント要素であるノードを返します(あなたの場合は<config>)。

rootElement を取得したら、(rootElement.getAttribute() メソッドを呼び出して) 要素の属性などにアクセスできます。Java のその他のメソッドについては、org.w3c.dom.Element

さらに明確にするために、このリンクを表示すると、非常に役立ちます...

http://www.java-samples.com/showtutorial.php?tutorialid=152

乾杯..!

于 2012-08-29T07:21:53.790 に答える