【问题标题】:Parsing nested vs flat XML element using Java in generic way以通用方式使用 Java 解析嵌套与平面 XML 元素
【发布时间】:2013-05-06 16:13:48
【问题描述】:

您好,我用 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 或任何其他方式。我尝试研究很多东西,但无法弄清楚任何东西。

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

【问题讨论】:

  • @AndrewThompson:这只是我用来解释我面临的问题的一个虚拟示例。没有想过这个。感谢您指出,但如果您有任何解决原始问题的想法,请告诉我。
  • 你提到“XSD”,你有xml的xsd吗?如果是这样,那么是的,您可以解决问题。如果没有,从一般意义上来说,你将很难解决这个问题。
  • 如果我有 XML 文件的 XSD,你能告诉我如何解决这个问题吗?请告诉我解决方案,仅当您建议我应该阅读完整的 XML 文件一次,在我的代码中以某种方式访问​​它的结构,但我的通用解析代码不会是通用的。因为当我尝试处理新的 XML 时,我需要对代码进行更改,以免我的代码变得通用。
  • 我确实在下面的回答中解释了我的评论。
  • xsd 是一个有据可查的规范...

标签: java xml xml-parsing xsd


【解决方案1】:

发生这种情况是因为 Address 元素有时以嵌套形式存在,并且 有一段时间是平坦的。

这种说法是不正确的。 Address 仍然嵌套在 Employee 元素下。在第二种情况下,它只是空的。如果您可以在通用代码中测试“空”元素(没有子元素的地址元素),则可以解决此问题。

【讨论】:

  • 在 XML 文件中,还有各种其他元素,这些元素大部分时间都是空的,或者如果没有纯文本值(与 Address 元素相比,Address 元素在不为空时有自己的子元素)。我同意它仍然嵌套在 Employee 下,但是由于当 Address 为空时它没有自己的孩子,所以在这种情况下它没有嵌套。
  • 另外,如果我测试空元素(一个可能有子元素,另一个可能有文本值而不为空),我将如何确定这个空元素是否应该进入新文件或应该与其父级在同一个文件中。如果你明白我在说什么,请告诉我。
  • @user1188611 通过示例发布您的代码。 junit 更好。
【解决方案2】:

如果您有 xsd,则可以解析 xsd 文件并确定哪些元素支持嵌套元素。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多