使用Java以通用方式解析嵌套XML元素与平面XML元素
您好,我用Java编写了一个通用代码,它解析XML输入文件而不知道其结构,并以逗号分隔的值输出值。假设我的XML文档中有以下内容:
<Employee>
<Name>XYZ</Name>
<Id>123</Id>
<Address>
<Office_Address>office address here</Office_Address>
</Address>
</Employee>
现在,我的Java代码将上述xml文件解析为逗号分隔的值,如下所示:
Employee (File 1): Name , ID
Address (File 2): Office_Address
也就是说,对于每个嵌套元素,其输出都是一个新的csv文件,其中的列等于其子节点
这很好,但现在的问题是:让我拥有与上述相同的XML文件:
<Employee>
<Name>XYZ</Name>
<Id>123</Id>
<Address/>
</Employee>
所以在这种情况下,当我的通用Java代码处理这个文件时,它输出为:
Employee (File 1) : Name, Id, Address
因此,我得到的不是两个输出文件,而是一个,文件1有时有3个条目,而不是2个条目。 这是因为Address元素有时是嵌套的,有时是扁平的。因此,当它嵌套时,Java代码会创建一个新的逗号,与之相对应,但当它没有嵌套时,它只输出一个文件
我可以通过硬编码这个元素的逻辑来解决这个问题。但我不想这样做,因为我的Java通用XML解析代码没有意义
所以我的问题是,我们可以用任何方式来确定,从相同来源生成的XML文件中的元素可能是嵌套的,有时是扁平的。使用XSD或任何其他方式。我试着研究了很多东西,但什么也没弄明白
提前感谢,希望得到解决方案或一些好的建议
# 1 楼答案
如果您有一个xsd,那么您可以解析xsd文件并确定哪些元素支持嵌套元素
如果没有xsd,那么基本上需要对整个xml文件进行一次解析,以确定所有可能的嵌套(即,基本上是检查xml文件以构建自己的xsd),然后再次解析它,根据第一次获得的知识实际输出最终结果
# 2 楼答案
这种说法是不正确的。Address仍然嵌套在Employee元素下。在第二种情况下,它只是空的。如果可以在泛型代码中测试“empty”元素(没有子元素的Address元素),那么这个问题就可以解决