是的,我真的要问一下用正则表达式解析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礼貌地忽略导致它崩溃的$字符?这似乎不太可能,但我认为我至少应该得到一些意见。
答案 0 :(得分:2)
不,没有办法让XmlDocument
解析不是xml的文档,无论它看起来多么接近xml!
如果可以,那么我绝对建议您将文档转换为实际的xml(或至少一些可识别的文档格式)。尝试为任何格式创建和维护一个可靠的工作解析器是相当多的工作,更不用说一种似乎没有明确定义的格式。
使用some_special_tag
元素来识别特殊部分对我来说似乎是一个好主意。如果需要,您可以使用不同的命名空间来确保不与文档中的其他元素发生冲突 - 这实际上与xslt的工作方式完全相同(“特殊”标记用于表示特殊事物,例如应替换的模板或节点)以及xml旨在支持的内容。
另外,我不明白为什么你需要在something_here
部分放置CDATA
位。 “破解”xml的所有字符都可以相当容易地转义(例如,将<
写为<
)。 CDATA
部分通常仅在节点内容需要进行大量转义时使用,以便更轻松,更简单地使用CDATA
部分。
更新:关于迁移到新格式,您不能同时使用这两种方法吗?尝试将文档解析为XML文档(或者如果存在性能问题,则执行一些其他测试以快速确定文档是否为“旧”或“新”格式,例如检查根元素中的版本属性) - 如果它不起作用,那么回到旧方法。
这种方式只要一切正常(只要没有任何变化)用户就不需要修改他们的文档,但是如果他们遇到问题或想要使用任何新功能,那么向他们解释他们必须将文档更新为新格式。
根据您当前“解析器”的工作情况,您甚至可以提供自动执行转换的升级实用程序(尽可能最好)。
答案 1 :(得分:0)
您无法在运行时将<$ something_here $>
替换为该CDATA
部分,然后照常加载XML文档吗?