【问题标题】:Dynamic XML Shredding in Java Without Using a Database不使用数据库的 Java 中的动态 XML 粉碎
【发布时间】:2012-01-19 02:50:42
【问题描述】:

在 Java 中是否有一种“标准化”方式(即代码模式,或者甚至更好的开源库)用于动态扁平化(“粉碎”)大尺寸的分层 XML 文件结构未知,输出未重定向到 RDBMS 但可直接访问?

我正在研究一种类似于this question 中提到的转换,但我看到的所有代码示例都使用一些 SQL 命令通过 RDBMS(例如 MySQL)将扁平化的 XML 输入注入到数据库表中。

我想做的是逐步将 XML 数据提取到一个字符串中,或​​者至少提取到一个文本文件中,之后可以对其进行后处理,而无需通过任何 RDBMS。

编辑:

在进一步解决该问题后,this question 中有几个使用 XSLT 的解决方案(包括完全可参数化的解决方案)。

【问题讨论】:

  • 是否可以分解未知结构的 XML 文件?
  • 我可能会使用 StAX 来兼顾速度和便利性,但这是一个相当通用的建议(对于一个非常通用的问题。)你确定你不能概述用例的类别吗你需要处理几个例子吗?
  • 当然。根据上面的编辑,可以在此问题的 XSLT 版本中找到详细示例。

标签: java xml parsing dynamic


【解决方案1】:

您可以使用 JDOM 来实现(参见下面的示例,jdom.jar 必须在类路径中)。但请注意,整个 dom 都在内存中。如果 XML 更大,您应该使用 XSLT 或 SAX 解析器。

import java.io.IOException;
import java.io.StringReader;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.junit.Test;

public class JDomFlatten {

@Test
public void testFlatten() {
    final String xml = "<grandparent name=\"grandpa bob\">"//
            + "<parent name=\"papa john\">"//
            + "<children>"//
            + "<child name=\"mark\" />"//
            + "<child name=\"cindy\" />"//
            + "</children>"//
            + "</parent>"//
            + "<parent name=\"papa henry\">"// 
            + "<children>" //
            + "<child name=\"mary\" />"//
            + "</children>"//
            + "</parent>" //
            + "</grandparent>";
    final StringReader stringReader = new StringReader(xml);
    final SAXBuilder builder = new SAXBuilder();
    try {
        final Document document = builder.build(stringReader);
        final Element grandparentElement = document.getRootElement();
        final StringBuilder outString = new StringBuilder();
        for (final Object parentElementObject : grandparentElement.getChildren()) {
            final Element parentElement = (Element) parentElementObject;
            for (final Object childrenElementObject : parentElement.getChildren()) {
                final Element childrenElement = (Element) childrenElementObject;
                for (final Object childElementObject : childrenElement.getChildren()) {
                    final Element childElement = (Element) childElementObject;

                    outString.append(grandparentElement.getAttributeValue("name"));
                    outString.append(" ");
                    outString.append(parentElement.getAttributeValue("name"));
                    outString.append(" ");
                    outString.append(childElement.getAttributeValue("name"));
                    outString.append("\n");
                }
            }

        }
        System.out.println(outString);

    } catch (final JDOMException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (final IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

}

【讨论】:

  • 感谢代码!我正在查看的文件确实很大,所以 JDOM 不是一个选项,并且内容以前不知道,这使事情变得非常复杂。我已经更新了原始问题以反映这一点。欢迎任何更多想法。
猜你喜欢
  • 2020-03-02
  • 1970-01-01
  • 2011-09-12
  • 2011-02-07
  • 2012-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
相关资源
最近更新 更多