在不知道xml文件结构的情况下解析xml文件内容

时间:2014-02-23 01:47:09

标签: java xml

我一直在努力学习一些使用java来解析文件的新技术,而对于msot部分,它一切顺利。但是,我很遗憾如何将xml文件解析为收到结构时未知的结构。如果您知道结构(getElementByTagName似乎是要走的路),那么如何做的大量示例,但没有动态选项,至少不是我找到的。

所以这个问题的tl; dr版本,如何解析一个我不能依赖于知道它结构的xml文件?

1 个答案:

答案 0 :(得分:13)

解析部分很容易;像注释中所述的helderdarocha一样,解析器只需要有效的XML,它不关心结构。您可以使用Java的标准DocumentBuilder来获取Document

InputStream in = new FileInputStream(...);
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in);

(如果您正在解析多个文档,则可以继续重复使用相同的DocumentBuilder。)

然后你可以从根文档元素开始,然后使用熟悉的DOM方法:

Element root = doc.getDocumentElement(); // perform DOM operations starting here.

至于处理它,它真的取决于你想用它做什么,但你可以使用Node的方法,如getFirstChild()getNextSibling()来迭代孩子和根据结构,标签和属性,您认为合适的过程。

考虑以下示例:

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilderFactory;   
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;


public class XML {

    public static void main (String[] args) throws Exception {

        String xml = "<objects><circle color='red'/><circle color='green'/><rectangle>hello</rectangle><glumble/></objects>";

        // parse
        InputStream in = new ByteArrayInputStream(xml.getBytes("utf-8"));
        Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in);

        // process
        Node objects = doc.getDocumentElement();
        for (Node object = objects.getFirstChild(); object != null; object = object.getNextSibling()) {
            if (object instanceof Element) {
                Element e = (Element)object;
                if (e.getTagName().equalsIgnoreCase("circle")) {
                    String color = e.getAttribute("color");
                    System.out.println("It's a " + color + " circle!");
                } else if (e.getTagName().equalsIgnoreCase("rectangle")) {
                    String text = e.getTextContent();
                    System.out.println("It's a rectangle that says \"" + text + "\".");
                } else {
                    System.out.println("I don't know what a " + e.getTagName() + " is for.");
                }
            }
        }

    }

}

输入XML文档(例如硬编码)是:

<objects>
    <circle color='red'/>
    <circle color='green'/>
    <rectangle>hello</rectangle>
    <glumble/>
</objects>

输出结果为:

It's a red circle!
It's a green circle!
It's a rectangle that says "hello".
I don't know what a glumble is for.