解析XML-ish数据
是的,我真的会问关于用正则表达式解析XML ......这里。解析XML-ish数据
我有一些XML-ISH数据,我需要解析它。我不能用XMLDocument或类似的东西完全做到这一点,因为它不是正确的XML,我不确定我能否(或想要)更改格式。主要的问题是具有特殊的意义,而像这样的标签:
<$ something_here $>
C#的XmlDocument的倒下对其进行解析时,我认为其他方法也会这样做的。我可以,用了很多的工作,上述更改为类似
<some_special_tag><![CDATA[ something_here ]]></some_special_tag>
但是,这是丑陋的,我真的不希望。改变这个过程非常耗时的原因是我有成百上千的XML文档需要更改。
目前,我用正则表达式解析文档。我只需要挑选一些特定的标签(不是上面的标签),它似乎在工作,但我对此感到不舒服。我在做这样的事情在此刻:
...
MatchCollection mc = Regex.Matches(Template, "<tagname.*?/tagname>"); // or similar
foreach (Match m in mc) {
try {
XmlDocument xd = new XmlDocument();
xd.LoadXml(m.Value);
...
这至少意味着我不使用正则表达式专门:)
任何人都可以想出一个更好的办法?有没有办法让XmlDocument礼貌地忽略导致它翻倒的$字符?这似乎不太可能,但我认为我应该至少得到一些意见。
不,没有办法让XmlDocument
解析不是xml的文档,不管它看起来有多接近xml!
如果有可能,那么我会绝对建议您将您的文件转换为实际的XML(或至少一些公认的文件格式)。试图为任何格式创建和维护一个可靠的工作分析器是相当多的工作,更不用说一种看起来没有严格定义的格式。
使用some_special_tag
元素来识别特殊部分似乎是一个好主意。如果需要,您可以使用不同的名称空间以确保与文档中的其他元素没有冲突 - 这实际上就是xslt的工作方式(“特殊”标签用于表示特殊的内容,例如应该替换的模板或节点)以及xml的设计支持。
另外我不明白你为什么需要将something_here
位放在CDATA
部分。所有“破解”xml的字符都可以很容易地转义出来(例如通过编写<
作为<
)。 CDATA
部分通常仅在节点内容需要非常多地转义时才使用,以至于使用CDATA
部分代替时更容易且不太麻烦。
更新:关于迁移到新格式,你不能使用这两种方法吗?尝试将文档解析为XML文档(或者如果存在性能问题,则执行一些其他测试以快速确定文档是否处于“旧”或“新”格式,例如检查根元素中的版本属性) - 如果它不起作用,则回到旧方法。
这种方式只要一切工作正常(只要没有任何变化),用户不需要修改他们的文档,但是如果他们遇到问题或想要使用任何新功能,那么解释他们必须将他们的文档更新为新格式。
根据当前“分析器”的工作原理,您甚至可以提供自动执行转换的升级实用程序(尽可能地)。
您不能在运行时将<$ something_here $>
替换为那个大的CDATA
部分,然后照常加载XML文档?
我同意,为特殊目的添加一个特殊的标签显然是解析方面的最佳选择,并且在将来能够继续解析xml文档。我只是非常希望我不会让我的用户改变他们的文档,并且记得以新的方式编写未来的文档......关于CDATA,确实可能会有很多转义,因为“特殊“位可能会很长,甚至可能是文档的大部分。 – Neil
@Neil你不能通过提供现有的方法作为回退来迁移吗?查看我的更新了解更多详情。 – Justin
我没有想到这一点。这听起来像它会工作得很好。 – Neil