2

我想解析一个不寻常的 XML 结构,如此处所示。两个自闭标签用于标记文本的开始和结束。因此,文本不在标签分区内。

<article>
  <sec>
    <clause id="31"/>This says thirty-one <clause_end/>
    <clause id="32"/>This says thirty-two <clause_end/>
  </sec>
</article>

遗留文档不太适合 XML 的离散层次要求,此模式试图解决这些问题。

  • 它与 XML 的任何合理实现一致吗?
  • 您对如何应用 XML 解析器有什么建议吗?

保持原始结构是可取的,但如果答案是否定的,那么我将不得不:

  1. 制作一个通常标记文本的替代模式:<clause id="32"> text </clause>.
  2. 通过去除其他干扰<clause>. 我很确定我不会错过任何事情。

顺便说一句,我很乐意链接到实时文件,除非我不想让开发人员感到尴尬,假设这个模式和我想的一样不正常。;-)

根据九十九的回答...

  • 它与 XML 的任何合理实现一致吗?
  • . . . 可能
  • 您对如何应用 XML 解析器有什么建议吗?
  • . . . 尽可能解析,但在架构中的这个级别,您必须使用字符串。

我可能会保留现有结构,但会引入一个小改进:

<article>
  <sec>
    <clause id="31"/>This says thirty-one <clause_end id="31"/>
    <clause id="32"/>This says thirty-two <clause_end id="32"/>
  </sec>
</article>
4

1 回答 1

1

这种结构在其他模式中肯定有先例,例如milestone-startmilestone-end国家医学图书馆标签集中(尽管我从未见过它们在超过一百万个文档中使用)。请注意,它们在 上包含一个IDREF属性以将milestone-end其与milestone-start/@id. 这肯定有助于您在解析时处理这些元素。

扩展 OSIS 评论,因为我发现这篇文章特别有趣和优雅(或者至少是解决这个混乱问题的优雅解决方案):

OSIS 中使用的解决方案是:既不使用通用里程碑标记,也不使用特定的额外标记,而是使用与里程碑和非里程碑元素完全相同的标记:以空和非空 XML 形式。一群人发出一声叹息。简而言之,

  • 尽可能使用<q who='paris'>...</q>,否则
  • 利用<q who='paris' sID='foo'/>...<q eID='foo'/>

这种在 Troy 之后被称为“Trojan 里程碑”的方法几乎可以免费使用典型的模式语言。不需要额外的元素。只需添加 sID 和 eID 属性,并确保允许空内容。因此,并非任何元素都不能随意或在需要时具有里程碑意义。正确的属性会自动出现,因为相同的声明是有效的。

于 2012-12-01T05:47:15.300 回答