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

2023-11-21

我一直在学习一些使用 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.

至于处理它,这实际上取决于你想用它做什么,但是你可以使用以下方法Node like getFirstChild() and 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.
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 尝试在 pgAdmin4 中备份数据库时出现“[Errno 2] 无此类文件或目录”

    我终于设法在首选项中手动设置 PostgreSQL 二进制路径 为什么用户必须在 pgAdmin3 中不需要时执行此操作 老实说 我不知道第二个路径字段 EDB Advanced Server Binary Path 的含义是什么 但我没有
  • HAProxy - 后端服务器的基本身份验证

    我使用以下配置从本地 127 0 0 1 2000 代理访问互联网 global log 127 0 0 1 local0 log 127 0 0 1 local1 notice log loghost local0 info maxcon
  • 修复重大升级问题

    以下是场景 1 安装 1 0 1 1 然后升级到 1 0 2 2 gt 这很好用 如预期 2 安装 1 0 2 2 然后降级到 1 0 1 1 gt 这不起作用 如预期 3 安装 1 0 1 1 然后安装 1 0 1 1 gt 这将进入修复
  • Python 字典 vs C++ std:unordered_map (cython) vs cythonized python dict

    我试图测量 python 字典 cythonized python 字典和 cythonized cpp std unordered map 之间的性能 仅执行 init 过程 如果编译 cythonized cpp 代码 我认为它应该比纯
  • .NET 中是否有与进程外 COM EXE 等效的东西?

    COM ActiveX 的优点之一是进程外 EXE 您可以有一个 EXE 它以可供其他进程 包括 VBScript 和 JScript 使用的形式公开方法和属性 同时 EXE 可以拥有自己的功能 与其类型库公开的功能相关或无关 NET 的等
  • 合作多重继承问题

    这是一个扩展这个问题并提出了一个问题 希望您 我的 StackOverflowers 同胞能够帮助我解决这个问题 从引用的问题中 考虑最终的代码示例 class A object def init self print entering A
  • 将任意 R 对象存储到 HDD 上?

    据我所知 我们可以将数据矩阵导出到csv or xlsx files 对于像这样的复杂对象呢 lm 例如 在我的工作中 我可能有一个长度为 1000 的列表 每个列表都有一个lm 目的 每次我加载R我必须等待很长时间才能用这些填充 1000
  • 错误:(-2:未指定错误)该功能未实现。使用 Windows、GTK+ 2.x 或 Cocoa 支持重建库

    我正在 jupyter 笔记本上从事手语检测项目 在运行活体检测代码时 我遇到了如下错误 OpenCV 4 5 1 C Users appveyor AppData Local Temp 1 pip req build 1drr4hl0 o
  • 加载数据时pig出错

    我使用的是 ubuntu 12 02 32bit 并已安装hadoop2 2 0 and pig 0 12成功地 Hadoop 在我的系统上运行正常 但是 每当我运行此命令时 data load atoz csv using PigStor
  • 将应用程序配置为 Facebook 错误:“应用程序的 Facebook 登录配置错误..”[重复]

    这个问题在这里已经有答案了 可能的重复 应用程序的 Facebook 登录配置错误 Android Facebook 集成问题 我正在尝试将 facebook 集成到我的应用程序中 当我按下登录按钮并填写电子邮件和密码时 我在应用程序中收到
  • Angular Material 7 拖放 x 和 y 坐标

    我有一个容器 里面有一个元素 我希望能够将元素拖动到容器内的另一个位置并查看新的 x 和 y 坐标 其中 x 0 和 y 0 是容器的左上角 我在以下位置设置了一个基本的 stackblitzhttps stackblitz com edi
  • 为什么我的数字四舍五入不正确?

    这感觉像是那种只会在原地失败的代码 但我会尝试将其改编成代表我所看到内容的代码片段 float f myFloat myConstInt Where myFloat 13 45 and myConstInt 20 int i int f i
  • 执行 pipfile 脚本

    如何执行 Pipfile 中定义的脚本 按照语法发现here 我在 pipfile 中定义了脚本部分 如下所示 scripts tests bash run tests sh 运行后 pipenv install 我怎样才能调用tests
  • 安装apk时出现java.lang.SecurityException

    如你所知 apk 是一个 zip 存档 我提取了它并替换了一些资源 然后再次压缩它 当我安装它时 我收到此异常 java lang SecurityException META INF MANIFEST MF 具有无效摘要 这个错误有什么解
  • 什么时候调用 C++ 析构函数?

    基本问题 程序何时调用 C 中类的析构函数方法 有人告诉我 只要一个对象超出范围或受到某个对象的影响 就会调用它delete 更具体的问题 1 如果该对象是通过指针创建的 并且该指针后来被删除或被赋予一个新的地址来指向 那么它所指向的对象是
  • TaskCreationOptions.AttachedToParent 不等待子任务

    根据 MSDN 您可以使用 AttachedToParent 选项来表达结构化任务 并行性 因为父任务隐式等待所有子任务 要完成的任务 所以我有这个代码 public async Task
  • 读取内核空间中的符号链接

    我正在编写 LKM 需要找出特定符号链接指向的位置 基本上我需要系统调用的功能readlinkat or readlink 但是在内核空间中 是否有捷径可寻 Using readlinkat直接对我不起作用 我总是收到 EFAULT 我猜这
  • 定义内部枚举[重复]

    这个问题在这里已经有答案了 在linux内核源代码中 我看到在枚举内部 是否还有一个与枚举元素同名的定义 示例中linux rtnetlink h我们有 enum RTM BASE 16 define RTM BASE RTM BASE R
  • 循环引用和 WCF

    我已经使用 POCO Generator 生成了 POCO 实体 我的数据库中有超过 150 个表 我在整个应用程序层 包括客户端 共享 POCO 实体 我在我的上下文中禁用了 LazyLoading 和 ProxyCreation 我在数
  • 在不知道xml文件结构的情况下解析xml文件内容

    我一直在学习一些使用 java 解析文件的新技术 对于 msot 部分 进展顺利 但是 我不知道如何将 xml 文件解析到收到后结构未知的位置 如果您知道结构的话 有很多关于如何执行此操作的示例 getElementByTagName 似乎