3

これが私のxmlコードです...

<flow>
    <TaskID>100</TaskID>
    <TaskID>101</TaskID>
    <TaskID>102</TaskID>
    <TaskID>103</TaskID>    
</flow>

Java の for ループで taskID 値を取得する方法を知りたいです。私を助けてください...

4

6 に答える 6

8

DOM パーサー ソリューション。かなりシンプルで、追加のライブラリは必要ありません。

public static void main(String[] args) throws SAXException, IOException,
        ParserConfigurationException {

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();

    String input = "<outer>";
    input += "<otherstuff><TaskID>123</TaskID></otherstuff>";
    input += "<flow>";
    input += "<TaskID>100</TaskID>";
    input += "<TaskID>101</TaskID>";
    input += "<TaskID>102</TaskID>";
    input += "<TaskID>103</TaskID>";
    input += "</flow>";
    input += "</outer>";
    Document document = builder.parse(new InputSource(new StringReader(
            input)));

    NodeList flowList = document.getElementsByTagName("flow");
    for (int i = 0; i < flowList.getLength(); i++) {
        NodeList childList = flowList.item(i).getChildNodes();
        for (int j = 0; j < childList.getLength(); j++) {
            Node childNode = childList.item(j);
            if ("TaskID".equals(childNode.getNodeName())) {
                System.out.println(childList.item(j).getTextContent()
                        .trim());
            }
        }
    }
}

入力がファイルからのものである場合は、代わりに FileReader を使用する必要があります。

Document document = builder.parse(new InputSource(new FileReader(
        new File("foo.xml"))));

getElementsByTagName() に代わるものは、XML のクエリ言語である XPath です。これは、照合する条件が複雑な場合に特に役立ちます。

XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile("//flow/TaskID/text()");

Object result = expr.evaluate(document, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
    System.out.println(nodes.item(i).getTextContent());
}

XML ファイルが数百 MB/GB のように大きい場合、またはメモリの少ないプラットフォームを使用している場合は、SAX パーサーを検討してください。

String input = "<flow><TaskID>100</TaskID><TaskID>101</TaskID><TaskID>102</TaskID><TaskID>103</TaskID></flow>";
SAXParser sax = SAXParserFactory.newInstance().newSAXParser();
DefaultHandler handler = new DefaultHandler() {
    private StringBuilder buffer = new StringBuilder();
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if ("TaskID".equals(qName)) {
            System.out.println(buffer);
            buffer = new StringBuilder();
        }
    }
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        buffer.append(ch, start, length);
    }
    @Override
    public void startElement(String uri, String localName,
            String qName, Attributes attributes) throws SAXException {
        buffer = new StringBuilder();
    }
};
sax.parse(new InputSource(new StringReader(input)), handler);
于 2012-11-13T06:51:06.190 に答える
4

これは、既存の Java XML パーサーよりも快適な API を提供するJDOMを使用した例です。

import java.io.File;
import org.jdom2.*;
import org.jdom2.input.*;

public class Test {
    // TODO: More appropriate exception handling :)
    public static void main (String[] args) throws Exception {
        SAXBuilder builder = new SAXBuilder();
        Document doc = builder.build(new File("test.xml"));
        Element root = doc.getRootElement();
        for (Element element : root.getChildren("TaskID")) {
            System.out.println(element.getText());
        }
    }
}

もちろん、これは XML ドキュメントがメモリにロードできるほど小さいことを前提としています。

(もちろん、組み込みライブラリも使用できます。XML の作業をあまり行っていない場合は、それで問題ありません。かなりの量の作業を行っている場合、それらは少し原始的だと思います。)

于 2012-11-13T06:58:05.507 に答える
0

私は個人的にすべての XML 操作にJDOMライブラリを使用しています。

 String xml = "<flow> " +
                   "<TaskID>100</TaskID>" +
                   "<TaskID>101</TaskID>" +
                   "<TaskID>102</TaskID>" + 
                   "<TaskID>103</TaskID>" + 
              "</flow>";

org.jdom.Document doc = new SAXBuilder().build(new StringReader(xml));

org.jdom.Element rootElement = doc.getRootElement();

List<Element> eles = rootElement.getChildren("TaskID");

for(Element el : eles)
   System.out.println(el.getName()+" : "+el.getValue());

ここでドキュメントを入手できます: http://www.jdom.org/

于 2012-11-13T07:10:25.880 に答える
0

SAX を使用した Xml 子の読み取り

<?xml version="1.0"?> 
<Patriarch>
   <name>Bill</name>
   <wife>
      <name>Vi</name>
   </wife>
   <son>
      <name>Bill</name>
   </son>
   <daughter>
      <name>Jeri</name>
      <husband>
         <name>Mark</name>
      </husband>
      <son>
         <name>Greg</name>
      </son>
      <son>
         <name>Tim</name>
      </son>
      <son>
         <name>Mark</name>
      </son>
      <son>
         <name>Josh</name>
         <wife>
            <name>Kristine</name>
         </wife>
         <son>
            <name>Blake</name>
         </son>
         <daughter>
            <name>Liah</name>
         </daughter>
      </son>
   </daughter>
</Patriarch>

そして Java コード:

public class ParseXmlSAX {

    public static void main(String[] args) {
        new ParseXmlSAX("file.xml");
    }

    public ParseXmlSAX(final String file) {
        try {

            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();

            DefaultHandler handler = new DefaultHandler() {
                String key = null;

                public void startElement(String uri, String localName, String qName, Attributes attributes)
                        throws SAXException {

                    if (key == null)
                        key = "|";
                    else
                        key += qName + "|";

                }

                public void endElement(String uri, String localName, String qName) throws SAXException {

                    if (!key.equals("|"))
                        key = key.substring(0, key.lastIndexOf(qName));

                }

                public void characters(char ch[], int start, int length) throws SAXException {
                    String conteudo = new String(ch, start, length).trim();

                    if (!conteudo.isEmpty()) {
                        System.out.println(key + " = " + conteudo);
                    }

                }

            };

            saxParser.parse(this.getClass().getResourceAsStream(file), handler);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
于 2016-02-13T14:14:44.827 に答える
0

xpath を使用する場合 詳細情報は次のとおりです。

http://www.vogella.com/articles/JavaXML/article.html

于 2012-11-13T06:48:38.480 に答える