首页 > 解决方案 > 在 xml 中解析 xml

问题描述

我有以下问题。我在 XML 中有一个 XML。参见示例:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE ..."><AIDEM><OSERVER>xxx</OSERVER>
<OBJECT SystemID = "111" ObjectID = "00000004009e8bc1" Docu = "some value" DirectoryID = "111" InternalType = "1" TemplateID = "1234" TemplateType = "6" TemplateName = "String">
<OHEADER><OFIELD FieldID = "1" FieldType = "3" FieldName = "string" IsEmpty = "no"><ODATETIME>11111</ODATETIME></OFIELD>
<OFIELD FieldID = "123" FieldType = "3" FieldName = "string" IsEmpty = "no"><ODATETIME>11111</ODATETIME></OFIELD>
<OFIELD FieldID = "124" FieldType = "1" FieldName = "string" IsEmpty =  "no"><TEST_STRING>&lt;mos&gt;
&lt;ID&gt;some.some.some&lt;/ID&gt;
&lt;sID&gt;some.some&lt;/sID&gt;
&lt;mID&gt;53570320&lt;/mID&gt;
&lt;mObj&gt;
&lt;oID&gt;cl178317481&lt;/oID&gt;
....
</TEST_STRING></OFIELD>

在此示例中,OFIELD 中的内部 XML 定义为 ID 124。这是 99% 正确的,但也可能在另一个字段中。现在我想从上面的 XML 中提取内部 XML 并将其创建为一个新的 XML 并保存没有内部 xml 的原始 XML。最后我想要两个新的xml,一个没有内部xml,一个只有内部xml。我需要哪些库包来解决这个问题?我非常感谢每一个提示。

public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException  {

    File file = new File("example.xml");

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document document = db.parse(file);

    DOMSource domSource = new DOMSource(document);
    StringWriter writer = new StringWriter();
    StreamResult result = new StreamResult(writer);
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer transformer = tf.newTransformer();
    transformer.transform(domSource, result);
    String mystring = writer.toString();
    System.out.println("String XML: \n" + mystring);

}

}

在我的示例中,我将所有内容都放在一个字符串中,但我不知道如何正确处理内部 XML。老实说,格式让我有点恼火。执行此操作并将内部 XML 打包到新 XML 中的好方法是什么?提前致谢。

标签: javaxmlxml-parsing

解决方案


您可以使用任何解析器将外部文档解析为 DOM(就像您已经做的那样)。

然后遍历 DOM,获取所有节点值并尝试再次使用 XML 解析它们。成功后,您可以保存文档(内部 XML),从 DOM 中删除该节点并保存它(外部没有嵌套 XML)。

最后像你已经做的那样使用转换器渲染文档。

为了提高效率,您可以尝试解析 TextNodes,但我不确定这 99% 是否仅影响文本节点或属性。


推荐阅读