java - 在 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><mos>
<ID>some.some.some</ID>
<sID>some.some</sID>
<mID>53570320</mID>
<mObj>
<oID>cl178317481</oID>
....
</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 中的好方法是什么?提前致谢。
解决方案
您可以使用任何解析器将外部文档解析为 DOM(就像您已经做的那样)。
然后遍历 DOM,获取所有节点值并尝试再次使用 XML 解析它们。成功后,您可以保存文档(内部 XML),从 DOM 中删除该节点并保存它(外部没有嵌套 XML)。
最后像你已经做的那样使用转换器渲染文档。
为了提高效率,您可以尝试解析 TextNodes,但我不确定这 99% 是否仅影响文本节点或属性。
推荐阅读
- c - 如何在不增加堆栈大小的情况下分解 C 函数
- javascript - 具有多个密钥对的 JSON 的适当数据结构
- php - 如何使用 Twig 创建可重用的表单输入?
- c# - 如何在仅 24 小时内每 10 分钟创建一次重复的 Hangfire 作业
- qt - 在 GUI 中删除 QAction 小部件时,“Ui”文件不更新
- json - TypeScript 中的“良好类型”是什么?
- arrays - TypeScript - 作为抽象类的子对象的数组的语法是什么?
- angular - 如何正确使用父组件中的服务?
- php - PHP/SQL 如果变量包含与表列中的 x 字符相同的字符串
- c# - 如何结合 LINQ 的查询和列表?