【问题标题】:How can i merge multiple xml into single xml in java如何在java中将多个xml合并为单个xml
【发布时间】:2023-03-23 20:38:01
【问题描述】:

考虑我有 2xml 具有相同结构的文件没有 dtd

xml1:

<DigestType name="Blogs">
<From>xxx@xx.org</FromEmail>
<EmailTimeStamp></EmailTimeStamp>
<EmailSubject></EmailSubject>
<BlogName href="">Merging XML</BlogName>
<Blog Count="2">
<listPost>
    <Title href="">Title</Title>
    <CommentCount>10</CommentCount>
    <Content>Post content...</Content>
</listBlogPost>
<listPost>
    <Title href="">Title1</Title>
    <CommentCount>10</CommentCount>
    <Content>Post content...</Content>
</listBlogPost>
</Blog>
</DigestType>

xml2:

<DigestType name="Blogs">
<From>xxx@xx.org</FromEmail>
<EmailTimeStamp></EmailTimeStamp>
<EmailSubject></EmailSubject>
<BlogName href="">Merging XML</BlogName>
<Blog Count="2">
        <listPost>
    <Title href="">Title2</Title>
    <CommentCount>1</CommentCount>
    <Content>content...</Content>
</listBlogPost>
<listPost>
    <Title href="">Title3</Title>
    <CommentCount>23</CommentCount>
    <Content>content...</Content>
</listBlogPost>
</Blog>

现在我想将这 2 个 xml 合并为一个

<DigestType name="Blogs">
<From>xxx@xx.org</FromEmail>
<EmailTimeStamp></EmailTimeStamp>
<EmailSubject></EmailSubject>
<BlogName href="">Merging XML</BlogName>
<Blog Count="4">
     <listPost>
    <Title href="">Title</Title>
    <CommentCount>10</CommentCount>
    <Content>Post content...</Content>
</listBlogPost>
<listPost>
    <Title href="">Title1</Title>
    <CommentCount>10</CommentCount>
    <Content>Post content...</Content>
</listBlogPost>


<listPost>
    <Title href="">Title2</Title>
    <CommentCount>1</CommentCount>
    <Content>content...</Content>
</listBlogPost>
<listPost>
    <Title href="">Title3</Title>
    <CommentCount>23</CommentCount>
    <Content>content...</Content>
</listBlogPost>
</Blog>
</DigestType>

我正在使用 java。谁能帮我找出解决方案。

谢谢 哎呀

【问题讨论】:

    标签: java xml


    【解决方案1】:

    使用XPath

    XPath xpath = XPathFactory.newInstance().newXPath();
    // load
    Document xml1 = (Document) xpath.evaluate("/", new InputSource("xml1.xml"),
        XPathConstants.NODE);
    NodeList listPosts = (NodeList) xpath.evaluate("/DigestType/Blog/listPost",
        new InputSource("xml2.xml"), XPathConstants.NODESET);
    // merge
    Element blog = (Element) xpath.evaluate("/DigestType/Blog", xml1,
        XPathConstants.NODE);
    for (int i = 0; i < listPosts.getLength(); i++) {
      Node listPost = listPosts.item(i);
      blog.appendChild(xml1.adoptNode(listPost));
    }
    // set count
    blog.setAttribute("Count", xpath.evaluate("count(listPost)", blog));
    // print
    DOMImplementationLS impl = (DOMImplementationLS) xml1.getImplementation();
    System.out.println(impl.createLSSerializer().writeToString(xml1));
    

    (您的 XML 格式不正确;我认为元素开头是正确的名称。)

    【讨论】:

      【解决方案2】:

      最简单的方法可能是将每个文件加载到 DOM 文档中,然后从 doc2 中获取适当的子文件并将它们添加到 doc1,然后写出 doc1。

      【讨论】:

        【解决方案3】:

        虽然 XPath 是一个不错的选择,但如果您的 XML 文档不是很大,我会推荐 JDom,因为它将整个文档加载到内存中。

        使用 JDom:

        try {
            SAXBuilder builder = new SAXBuilder();
            Document firstDocument = builder.build(firstFile);
            Document secondDocument = builder.build(secondFile);
        
            Element firstRoot = firstDocument.getRootElement();
            Element secondRoot = secondDocument.getRootElement();
        
            List<Element> sourceListPost = secondRoot.getChild("listPost");
            firstRoot.addContent(sourceListPost);
        
            Document merged = new Document(firstRoot);
        } catch(JDOMException e) {
            e.printStackTrace();
        } catch(IOException e) {
            e.printStackTrace();
        }
        

        现在合并包含合并的文档。您可以使用XMLOutputter 将其序列化为一个文件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-20
          • 2013-05-15
          • 2011-08-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-12
          • 2012-06-01
          相关资源
          最近更新 更多