1

我有一些以下格式的可怕 xml(匿名以保护有罪者):

<root>
  <outer attribute="myValue">
    <middle>
      <inner>
        arbitrary text<break />more arbitrary text<break />
      </inner>
    </middle>
  </outer>
  ...
  <outer attribute="myValue">
    <middle>
      <inner>
        arbitrary text<break />more arbitrary text
      </inner>
    </middle>
  </outer>
</root>

自闭合节点代表段落中断,而移动到完全独立的外部/中间/内部树根本没有意义(并且不能导致段落中断)。

直接的 XPath 表达式/*/outer/middle/inner/text()让我获得了所有的文本元素,但我不再知道何时不为新的文本节点开始一个新的段落。(由于命名空间滥用和其他杂乱无章,实际的表达远没有那么简单,但这就是它的要点)。

绕过这个缺点并正确忽略文本之间的非段落分隔符的最佳方法是什么?有没有办法我也可以捕获中断节点并在保留顺序的列表中的文本节点中识别它们?

对于其他上下文,我正在使用 %XML.XPATH.Document API(它包装了标准 SAX,但在该方法的复杂程度方面仍可能受到限制)在 Intersystems Cache 中工作。

一些参考资料:

http://docs.intersystems.com/cache20131/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%XML.XPATH.Document

http://docs.intersystems.com/cache20131/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25XML.XPATH.ResultHandler

4

1 回答 1

1

您可能只想使用 / /outer/middle/inner/选择内部元素。中的值

%ListOfObjects(CLASSNAME="%XML.XPATH.RESULT")

将是 %XML.XPATH.DOMResult 类型,而不是你得到的 %XML.XPATH.ValueResult 类型。%XML.XPATH.DOMResult 值将表示包含任意文本节点和“中断”节点的 DOM 子树。

%XML.XPATH.Document 类有一个可以说明的 Example2 方法。您可能希望使用 this 的子类来覆盖具有更多中间节点的“ExampleXML”XData 块,并使用返回整个子树的 XPATH 表达式复制 Example2。这应该清楚如何处理您实际更复杂的问题。

于 2013-08-08T22:27:12.847 回答