解析XML-ish数据

时间:2011-07-19 09:44:43

标签: c# xml regex parsing

是的,我真的要问一下用正则表达式解析XML ...这里有。

我有一些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礼貌地忽略导致它崩溃的$字符?这似乎不太可能,但我认为我至少应该得到一些意见。

2 个答案:

答案 0 :(得分:2)

不,没有办法让XmlDocument解析不是xml的文档,无论它看起来多么接近xml!

如果可以,那么我绝对建议您将文档转换为实际的xml(或至少一些可识别的文档格式)。尝试为任何格式创建和维护一个可靠的工作解析器是相当多的工作,更不用说一种似乎没有明确定义的格式。

使用some_special_tag元素来识别特殊部分对我来说似乎是一个好主意。如果需要,您可以使用不同的命名空间来确保不与文档中的其他元素发生冲突 - 这实际上与xslt的工作方式完全相同(“特殊”标记用于表示特殊事物,例如应替换的模板或节点)以及xml旨在支持的内容。

另外,我不明白为什么你需要在something_here部分放置CDATA位。 “破解”xml的所有字符都可以相当容易地转义(例如,将<写为&lt;)。 CDATA部分通常仅在节点内容需要进行大量转义时使用,以便更轻松,更简单地使用CDATA部分。

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

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

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

答案 1 :(得分:0)

您无法在运行时将<$ something_here $>替换为该CDATA部分,然后照常加载XML文档吗?