加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 解析xml文件内容而不知道xml文件结构

发布时间:2020-12-14 16:46:29 所属栏目:Java 来源:网络整理
导读:我一直在使用 java来学习一些新的技术来解析文件,而对于msot的部分,我一直在努力.不过,我对于如何解析xml文件到结构在收到时未知的地方,我感到失落.很多例子,如果你知道结构(getElementByTagName似乎是去的方式),但没有动态选项,至少不是我已经找到了这样做.
我一直在使用 java来学习一些新的技术来解析文件,而对于msot的部分,我一直在努力.不过,我对于如何解析xml文件到结构在收到时未知的地方,我感到失落.很多例子,如果你知道结构(getElementByTagName似乎是去的方式),但没有动态选项,至少不是我已经找到了这样做.

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

解决方法

解析部分很简单;就像holderdarocha在评论中所说的那样,解析器只需要有效的 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.

至于处理它,它真的取决于你想要做什么,但是你可以使用像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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读