解析xml数据

本文关键字:数据 xml 解析 | 更新日期: 2023-09-27 18:02:49

是的,我真的要问解析XML与正则表达式…这里。

我有一些xml数据,我需要对其进行解析。我不能用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礼貌地忽略导致它翻倒的$字符?这似乎不太可能,但我想我至少应该征求一些意见。

解析xml数据

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

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

使用some_special_tag元素来标识特殊的部分对我来说似乎是个好主意。如果有必要,您可以使用不同的名称空间,以确保不与文档中的其他元素冲突——这实际上正是xslt的工作方式("特殊"标记用于表示特殊的东西,如应该替换的模板或节点),也正是xml设计要支持的。

我也不明白为什么你需要把something_here位在CDATA部分。所有"中断"xml的字符都可以相当容易地转义(例如,将<写成&lt;)。CDATA节通常只在节点的内容需要大量转义的情况下使用,这样使用CDATA节更容易,也不那么混乱。

Update:关于迁移到新格式,您可以不使用这两种方法吗?尝试将文档解析为XML文档(或者如果存在性能问题,则执行一些其他测试以快速确定文档是"旧"格式还是"新"格式,例如检查根元素中的version属性)—如果不起作用,则退回到旧方法。

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

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

不能在运行时将<$ something_here $>替换为CDATA部分,然后像往常一样加载XML文档吗?