我想解析一个不寻常的XML结构,如下所示。两个自动关闭标签用于标记文本的开头和结尾。因此,文本不在标记分区内。
<article>
<sec>
<clause id="31"/>This says thirty-one <clause_end/>
<clause id="32"/>This says thirty-two <clause_end/>
</sec>
</article>
遗留文档不太适合XML的离散层次化要求,并且此模式尝试解决这些问题。
保持原始结构是可取的,但如果答案为否,那么我将不得不:
<clause id="32"> text </clause>
。<clause>
的其他标记,使文档格式正确。我很确定没有什么我会错过的。顺便说一下,我很乐意链接到实时文件,除了我宁愿不让开发人员难堪,假设这个模式和我想象的一样偏离。 ; - )
我可能会保留现有的结构,但会引入一个小的增强功能:
<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>
答案 0 :(得分:1)
在其他模式中,这种结构肯定有先例,例如milestone-start
中的milestone-end
和National Library of Medicine Tag Set(虽然我从未在超过一百万份文档中看到过它们) 。请注意,它们在IDREF
上包含milestone-end
属性,可将其与milestone-start/@id
配对。在解析时,这肯定有助于处理这些元素。
扩展OSIS评论,因为我发现这个特别有趣和优雅(或者至少是一个可以解决这个混乱问题的优雅解决方案),来自this article:
OSIS中使用的解决方案是:既不使用通用里程碑标记也不使用特定的额外标记,而是使用与里程碑和非里程碑元素完全相同的标记:在空格式和非空格式中。通过小组的sighran。简而言之,
- 尽可能使用
<q who='paris'>...</q>
,否则- 使用
<q who='paris' sID='foo'/>...<q eID='foo'/>
这种方法在特洛伊被称为“特洛伊木马里程碑”之后,几乎可以免费使用典型的模式语言。不需要额外的元素。只需添加sID和eID属性,并确保允许空内容。因此,任何元素都不会随意或需要时具有里程碑意义。正确的属性会自动生成,因为相同的声明生效。