解析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的字符都可以很容易地转义出来(例如通过编写<作为&lt;)。 CDATA部分通常仅在节点内容需要非常多地转义时才使用,以至于使用CDATA部分代替时更容易且不太麻烦。

更新:关于迁移到新格式,你不能使用这两种方法吗?尝试将文档解析为XML文档(或者如果存在性能问题,则执行一些其他测试以快速确定文档是否处于“旧”或“新”格式,例如检查根元素中的版本属性) - 如果它不起作用,则回到旧方法。

这种方式只要一切工作正常(只要没有任何变化),用户不需要修改他们的文档,但是如果他们遇到问题或想要使用任何新功能,那么解释他们必须将他们的文档更新为新格式。

根据当前“分析器”的工作原理,您甚至可以提供自动执行转换的升级实用程序(尽可能地)。

+0

我同意,为特殊目的添加一个特殊的标签显然是解析方面的最佳选择,并且在将来能够继续解析xml文档。我只是非常希望我不会让我的用户改变他们的文档,并且记得以新的方式编写未来的文档......关于CDATA,确实可能会有很多转义,因为“特殊“位可能会很长,甚至可能是文档的大部分。 – Neil

+1

@Neil你不能通过提供现有的方法作为回退来迁移吗?查看我的更新了解更多详情。 – Justin

+0

我没有想到这一点。这听起来像它会工作得很好。 – Neil

您不能在运行时将<$ something_here $>替换为那个大的CDATA部分,然后照常加载XML文档?