以通用方式使用Java解析嵌套XML元素与平面XML元素

以通用方式使用Java解析嵌套XML元素与平面XML元素,java,xml,xml-parsing,xsd,Java,Xml,Xml Parsing,Xsd,嗨,我用Java编写了一个通用代码,它解析XML输入文件而不知道其结构,并以逗号分隔的值输出值。假设我的XML文档中有以下内容: <Employee> <Name>XYZ</Name> <Id>123</Id> <Address> <Office_Address>office address here</Office_Address> </Ad

嗨,我用Java编写了一个通用代码,它解析XML输入文件而不知道其结构,并以逗号分隔的值输出值。假设我的XML文档中有以下内容:

<Employee>
    <Name>XYZ</Name>
    <Id>123</Id> 
    <Address>
         <Office_Address>office address here</Office_Address>
    </Address>
</Employee>
也就是说,对于每个嵌套元素,其输出都是一个新的csv文件,其中的列等于其子节点

这很好,但现在的问题是:让我使用与上述相同的XML文件:

 <Employee>
    <Name>XYZ</Name>
    <Id>123</Id> 
    <Address/>
</Employee>
因此,我得到的不是两个输出文件,而是一个,文件1有时有3个条目,而不是2个条目。 这是因为Address元素有时是嵌套的,有时是平面的。因此,当它是嵌套的时,Java代码创建一个新的逗号,并与之相对应,但当它不是嵌套的时,它只输出一个文件

我可以通过硬编码这个元素的逻辑来解决这个问题。但我不想这样做,因为我的Java通用XML解析代码没有意义

所以我的问题是,我们可以用任何方式来确定从相同源生成的XML文件中的元素可能是嵌套的,有时是平面的。使用XSD或任何其他方式。我试着研究了很多东西,但什么也没弄明白

提前感谢,希望得到解决方案或一些好的建议

这是因为Address元素有时以嵌套和 有些时间是平的


这种说法是不正确的。Address仍然嵌套在Employee元素下。在第二种情况下,它只是空的。如果可以在泛型代码中测试“empty”元素(没有子元素的Address元素),那么这个问题就可以解决

如果您有一个xsd,那么您可以解析xsd文件并确定哪些元素支持嵌套元素


如果您没有xsd,那么您基本上必须对整个xml文件进行一次解析,以确定所有可能的嵌套(即,您基本上是在检查xml文件以构建自己的xsd),然后再次解析它,根据您从第一次传递中获得的知识实际输出最终结果。

在XML文件中,还有各种其他元素,它们大多数时候是空的,或者如果没有纯文本值(与Address元素相比,Address元素在不为空时有自己的子元素)。我同意它仍然嵌套在Employee下,但由于当Address为空时,它没有自己的子元素,因此在该上下文中它没有嵌套。另外,如果我测试空元素(可能有子元素的元素,而不是非空时可能有文本值的元素)然后我将如何确定这个空元素是应该放在新文件中,还是应该和它的父元素放在同一个文件中。如果你明白我说的话,请告诉我。@user1188611用一个例子发布你的代码。“朱尼特甚至更好。”安德烈·霍姆普森:这只是我用来解释我面临的问题的一个虚构的例子。没有想到这一点。谢谢你指出,但如果你有任何想法来解决最初的问题,请告诉我。如果你提到“XSD”,你有xml的XSD吗?如果是这样,那么是的,你可以解决这个问题。如果没有,你将很难从一般意义上解决这个问题。你能告诉我,如果我有XML文件的XSD,如何解决这个问题吗。请告诉我解决方案,如果您建议我应该阅读完整的XML文件一次,在我的代码中访问它的结构,但是我的通用解析代码不会是通用的。因为当我试图处理新的XML时,我需要在代码中进行更改,这样就不会让我的代码变得泛型。我在下面的回答中解释了我的评论。xsd是一个有很好文档记录的规范。。。
 <Employee>
    <Name>XYZ</Name>
    <Id>123</Id> 
    <Address/>
</Employee>
Employee (File 1) : Name, Id, Address