加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

是否有针对.NET的向后XML解析器?

发布时间:2020-12-16 23:04:04 所属栏目:百科 来源:网络整理
导读:在我的应用程序中,我对 XML字符串有一个已知的偏移,并希望回答诸如“什么是我的父元素?”之类的问题.无需解析整个文档. 这个article提到了一个库,它似乎在Objective-C中用于“向后”XML解析.我的应用程序不需要完整的XML支持,所以我很乐意忍受所有关于无法
在我的应用程序中,我对 XML字符串有一个已知的偏移,并希望回答诸如“什么是我的父元素?”之类的问题.无需解析整个文档.

这个article提到了一个库,它似乎在Objective-C中用于“向后”XML解析.我的应用程序不需要完整的XML支持,所以我很乐意忍受所有关于无法完全解析的警告. C#/ .NET有这样的东西吗?

澄清:我一般都不会问解析解决方案或性能权衡,我对特定的情况感兴趣,我在某个时候通过文本流中途,只需要了解一下本地结构.想象一下我不想获得文档顶部的情况,因为访问具有非常高的延迟.

解决方法

如果不对文本的性质做出一些重要的假设,就不可能做到这一点.最值得注意的是,您必须假设它是格式良好的XML,并且它既不包含CDATA部分也不包含名称空间.

如果从流中间的任何位置开始并返回直到您点击看似元素开头的位置,您无法知道您正在查看的文本实际上是元素的开头.它可能是CDATA.你不能告诉它不是CDATA,直到你回溯整个流寻找<![CDATA [并且还没有找到它]. 命名空间也存在类似的问题.如果你找到一个像< Foo这样的开始标记,你就不能确定Foo是否在默认命名空间中,直到你一直回溯到文档的根元素并确定没有祖先元素有一个名称空间声明.如果找到< x:Foo,则必须回溯,直到找到带有xmlns:x声明的封闭元素. 如果您确定文本是格式良好的XML,它不包含CDATA,并且它对命名空间的使用是有限的(即,只需通过查看其开始标记就可以知道元素的名称空间),那么你要做的一些事情至少是可能的. 您可以备份到遇到的第一个开始标记,创建一个源自该位置的StreamReader,并使用它创建一个设置为处理文档片段的XPathDocument.顺便提一下,请注意,您不能保证XPathDocument在第一次使用时不会一直读到文本的末尾,除非您再次了解文本的性质,并且您知道匹配的结束标记将存在. 但是这不会处理你提到的具体情况,即找到父元素.要查找父元素,您需要找到一个匹配结束标记之前(当您向后移动时)的开始标记.这并非非常困难 – 每一个<您找到的字符将是开始标记,结束标记或空元素的开头,您可以将结束标记放在堆栈上,并在找到匹配的开始标记时将其弹出.当您点击开始标记并且堆栈为空时,您就在父元素的开头. 但这也是一个可能导致您回溯到流的起源的过程,尤其是在您正在寻找的XML是经典的XML日志格式的简单情况中:

<log>
   <entry>...</entry>
   <entry>...</entry>

……无限重复

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读