不使用数据库的Java动态XML碎化

时间:2011-12-13 07:26:25

标签: java xml parsing dynamic

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

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

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

修改

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

1 个答案:

答案 0 :(得分:2)

你可以使用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();
    }

}

}