加载XML文档 - 名称不能以零字符开头

时间:2011-10-06 13:02:50

标签: c# .net xml

我正在尝试将声称是XML文档的内容加载到任何类型的.net XML对象中:XElementXmlDocumentXmlTextReader。所有这些都抛出异常:

  

名称不能以'0'字符开头,十六进制值0x30

与“XML”

相关的错误
<chart_value 
    color="ff4400" 
    alpha="100" 
    size="12" 
    position="cursor" 
    decimal_char="." 
    0="" 
/>

我认为问题是作者不应该将属性命名为0

如果我能改变这个,我会,但我无法控制这个饲料。我想那些使用它的人正在使用更宽松的工具。无论如何我可以加载它作为XML而不会抛出错误?

既没有XML声明,也没有命名空间或合约定义。我以为我可能不得不将它变成一个字符串并进行替换,但这不是很优雅。想知道是否还有其他选择。

4 个答案:

答案 0 :(得分:3)

正如许多人所说,这不是XML

话虽如此,几乎是XML WANTS是XML ,所以我认为你不应该使用正则表达式来解决它内部的问题({{ 3}})。

无论您何时获取流,转储到字符串中,将0=更改为zero=之类的内容并尝试解析它。

如果您必须返回发件人,请不要忘记撤消操作。


如果您正在阅读文件,则可以执行以下操作:

        var txt = File.ReadAllText(@"\path\to\wannabe.xml");
        var clean = txt.Replace("0=", "zero=");
        var doc = new XmlDocument();
        doc.LoadXml(clean);

这不能保证删除所有潜在的XML问题 - 但它应该删除你拥有的那个。

答案 1 :(得分:3)

只需用'_'替换数字值 示例:“0 =”替换为“_0 =” 我希望能解决这个问题,谢谢。

答案 2 :(得分:2)

它可能声称是一个XML文档,但声明显然是错误的,所以你应该拒绝该文档。

处理错误XML的唯一好方法是找出产生它的软件位,然后修复它或丢弃它。如果人们开始容忍几乎是XML但不完全的东西,那么XML的所有好处就会消失。

答案 3 :(得分:0)

0=""显然使用了无效的属性名称0。如果您无法在创建XML的源上修复它,则可能必须执行查找/替换以尝试修复XML。您可以使用RegEx来尝试更有效地处理XML字符串。