包含多个根元素的XML文件

4
我有一个文件,其中包含多个根元素集。如何逐个提取根元素?
这是我的XML。
<Person>
    <empid></empid>
    <name></name>
</Person>
<Person>
    <empid></empid>
    <name></name>
</Person>
<Person>
    <empid></empid>
    <name></name>
</Person>

我该如何逐个提取一个Person集?

你的标签显示为“java”,但不太明显你是在寻找一个库还是一个代码解决方案。这个问题变得非常广泛... - firelynx
3
这不是一个有效的 XML 文档。 - laune
有效的 XML 文件不能包含多个根元素。但是你有以下几个选项:1. 将你的 XML 代码封装在 <Root> 元素中,并通过常见的 Java 库代码(例如 DocumentBuilder)进行解析。2. 以文本形式读取,将其封装在 <Root> 标签中,并回退到(1)。3. 手动解析它。 - korifey
Laune和korifey,没错,但您的意思是“well-formed”而不是“valid”。(链接: https://dev59.com/l3VC5IYBdhLWcg3w9GLM#25830482) - kjhughes
你能帮我吗?如何通过代码添加一个根元素到这个XML文件中? - Gopal2311
3个回答

10

使用java.io.SequenceInputStream来欺骗XML解析器:

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilderFactory;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.SequenceInputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class MultiRootXML{
    public static void main(String[] args) throws Exception{
        List<InputStream> streams = Arrays.asList(
                new ByteArrayInputStream("<root>".getBytes()),
                new FileInputStream("persons.xml"),
                new ByteArrayInputStream("</root>".getBytes())
        );
        InputStream is = new SequenceInputStream(Collections.enumeration(streams));
        Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
        NodeList children = doc.getDocumentElement().getChildNodes();
        for(int i=0; i<children.getLength(); i++){
            Node child = children.item(i);
            if(child.getNodeType()==Node.ELEMENT_NODE){
                System.out.println("persion: "+child);
            }
        }
    }
}

我认为这是基于原始问题的正确答案。 - CodeChimp

3

您不能使用XML解析器解析您的文件,因为您的文件不是XML。XML不能有多个根元素。

您必须将其视为文本,修复它成为格式良好的文本,然后才能使用XML解析器解析它。


-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接