在我的应用程序中,我对 XML 字符串有一个已知的兴趣偏移量,并且想回答诸如“我的父元素是什么?”之类的问题。无需解析整个文档。
这article提到了一个似乎在 Objective-C 中用于“向后”XML 解析的库。我的应用程序不需要完整的 XML 支持,所以我很乐意忍受所有关于无法完全可靠地解析的警告。 C#/.NET 有这样的东西吗?
澄清:我不是在询问一般的解析解决方案或性能权衡,我对特定情况感兴趣,在这种情况下,我正处于文本流的中途,只需要了解一些有关本地结构的信息。想象一下我不想获取文档顶部的情况,因为访问具有非常高的延迟。
最佳答案
如果不对文本的性质做出一些重要的假设,就不可能做到这一点。最值得注意的是,您必须假设它是格式正确的 XML,并且它既不包含 CDATA 部分也不包含 namespace 。
如果您从流中间的任何位置开始并返回,直到您点击似乎是元素的开头,您无法知道您正在查看的文本实际上是 元素的开始。它可能是 CDATA。在回溯整个流寻找 <![CDATA[ 之前,您无法判断它不是 CDATA。还没有找到。
命名空间存在类似的问题。如果你发现一个像 <Foo 这样的开始标签,你不能确定 Foo位于默认命名空间中,直到您一直回溯到文档的根元素并确定没有祖先元素具有命名空间声明。如果你找到<x:Foo , 你必须回溯直到找到一个带有 xmlns:x 的封闭元素声明。
如果您确定该文本是格式正确的 XML,它不包含 CDATA,并且它对 namespace 的使用是有限的(即您可以通过查看元素的开头来判断该元素位于哪个 namespace 中标签),那么您尝试做的一些事情至少是可能的。
你可以备份到你遇到的第一个开始标签,创建一个StreamReader其起源是那个位置,并用它来创建一个 XPathDocument设置为处理文档片段。请注意,顺便说一下,您不能保证 XPathDocument在您第一次使用它时不会一直读到文本的末尾,除非您再次了解文本的性质并且您知道将出现匹配的结束标记。
但这不会处理您提到的特定情况,即查找父元素。要找到父元素,您需要找到一个开始标记,该标记之前(当您向后移动时)没有匹配的结束标记。这并不是很难做到——每个 <您找到的字符将成为开始标签、结束标签或空元素的开始,您可以将结束标签放在堆栈上,并在找到匹配的开始标签时将其弹出。当您点击开始标记并且堆栈为空时,您就位于父元素的开头。
但这也是一个可能导致您一直回溯到流源的过程,尤其是在您正在查看的 XML 是典型的白痴 XML 日志格式的微不足道的情况下:
<log>
<entry>...</entry>
<entry>...</entry>
...无限重复
关于.net - .NET 是否有向后的 XML 解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1998910/
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查