【问题标题】:Loading XML Document - Name cannot begin with the zero character加载 XML 文档 - 名称不能以零字符开头
【发布时间】:2012-11-22 17:20:47
【问题描述】:

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

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

与'XML'有关的错误

<chart_value 
    color="ff4400" 
    alpha="100" 
    size="12" 
    position="cursor" 
    decimal_char="." 
    0="" 
/>

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

如果我可以更改此设置,我会更改,但我无法控制此提要。我想那些使用它的人正在使用更宽松的工具。无论如何我可以将其加载为 XML 而不会引发错误?

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

【问题讨论】:

  • XML 解析器总是会阻塞无效的 XML 文档。这可能是手工制作的,或者是使用字符串连接构建的,而不是通过 XML 工具。
  • 这确实是一段完全无效的 XML - 所以您需要进行搜索和替换。
  • 请原谅我的迂腐编辑。想要明确您的问题的根源是 这不是 XML
  • 加载错误 XML、将其推入字符串并对其执行替换的最佳方法是什么?如果我加载 XMLReader 然后执行 reader.ReadOuterXml() 它仍然会抛出错误
  • 因为它仍然不是有效的 XML。 XML 非常严格,有些程序员非常愚蠢——不得不自己处理这种异常情况。这不是 XML,因此 XML 解析器无法工作。而且 XML 对验证基本结构非常严格。

标签: c# .net xml


【解决方案1】:

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

话虽如此,几乎是 XML 并且 想要成为 XML,所以我认为你不应该使用正则表达式来搞砸它(@987654321 @)。

无论您从哪里获取流,都转储到一个字符串中,将0= 更改为zero= 之类的内容,然后尝试解析它。

如果必须退回发件人,请不要忘记反转操作。


如果你正在读取文件,你可以这样做:

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

这并不能保证消除所有潜在的 XML 问题——但它应该可以消除您所遇到的问题。

【讨论】:

  • 加载错误 XML、将其推入字符串并对其执行替换的最佳方法是什么?如果我加载 XMLReader 然后执行 reader.ReadOuterXml() 它仍然会抛出错误
  • 您的数据最初是如何到达的?来自文件还是网络服务?如果是后者,它可能已经是一个字符串。如果是文件,请使用 StreamReader 和 ReadToEnd(),它将为您提供一个字符串。
  • 不要调用Close()Dispose()(这是多余的),最好使用using。或者直接使用File.ReadAllText()
  • 抱歉,我遇到了一些内存泄漏问题,只要两种方法都存在就开始关闭和处理。这是巫毒编码,我应该知道得更好。根据您的建议清理了样本。
  • 事情是我必须从 HTTP 请求中提取 XML...有没有办法将 HTTP 请求拉入 File 对象?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 但是,作为程序员,我们并不总是可以选择让老板告诉我们的供应商去远足。我曾经有一个客户的供应商要求我们发送给他们的 XML 有 CRLF 结尾而不是 CR(或类似的东西)。对 XML 来说完全不重要的东西。但是没有办法让它们改变,所以我不得不 git-r-done。然后当 xml-elements 的 ORDER 发生变化时,有一位同事大量抱怨。他不得不重新编写他的代码!可怜的东西.....
    • 不,但是您可以向您的老板明确表示您不再与供应商交换 XML 格式的数据,而是采用专有格式,这会增加成本和风险。把它翻译成老板能理解的商业术语,你就会得到听证会。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      相关资源
      最近更新 更多