Java中是否存在“标准化”方式(即代码模式,或更好的开源库),用于动态展平(“粉碎”)大型分层 XML 文件和未知结构,输出没有重定向到RDBMS但可以直接访问?
我正在研究像this question中提到的那样的转换,但我看到的所有代码示例都使用一些SQL命令通过RDBMS(例如MySQL)将展平的XML输入注入到数据库表中)。
我想要做的是逐步将XML数据提取到字符串中,或者至少提取到文本文件中,之后可以对其进行后处理,而无需通过任何RDBMS。
修改
在进一步研究该问题之后,this question中有一些使用 XSLT (包括完全可参数化的)的解决方案。
答案 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();
}
}
}