【问题标题】:Disable XML validation when using XDocument使用 XDocument 时禁用 XML 验证
【发布时间】:2011-03-31 09:13:24
【问题描述】:

我正在使用 XDocument 类解析XLIFF 文档。 XDocument 是否对我读入的内容进行了一些验证,如果是,有什么方法可以禁用该验证?

如果 XLIFF 不是有效的 XML,我会收到一些奇怪的错误(我不在乎它不是,我只是想解析它)。

例如

'.', hexadecimal value 0x00, is an invalid character. 

我目前正在阅读这样的文件:

string FileLocation = @"C:\XLIFF\text.xlf";
XDocument doc = XDocument.Load(FileLocation);

谢谢。

【问题讨论】:

  • 如何将 xml 加载到 XDocument 中?从文件 ?你能显示那行代码吗?
  • 如果它无效,那么它不是 XML。 XDocument 怎么能用它?
  • @HABJAN - 是的,我只是从文件中加载内容。
  • @Jimmy C:我能看到那几行代码吗?
  • @habjan 我已经添加了用于读取文件的代码。

标签: c# .net validation linq-to-xml


【解决方案1】:

我遇到了类似的问题,通过让 StreamReader 读取内容已解决。

// this line throws exception like yours
XDocument xd = XDocument.Load(@"C:\test.xml");

// works
XDocument xd = XDocument.Load(new System.IO.StreamReader(@"C:\test.xml"));

如果这没有帮助,请尝试包含正确的编码。

【讨论】:

  • 谢谢,我现在正在尝试。
  • 这似乎奏效了 - 你能向我解释为什么它有效吗?
  • 因为 StreamReader 似乎自动检测编码。
  • 没有。 StreamReader 默认为 UTF-8,如 Remarks of its MSDN page 中所述。
  • 非常感谢大家。现在将尝试使用更多语言的 XLIFF 文件。
【解决方案2】:

如果要从 XML 中使用无效的字符串中去除字符,可以使用此方法:

private static string RemoveXmlInvalidCharacters(string s)
{
    return Regex.Replace(
        s,
        @"[^\u0009\u000A\u000D\u0020-\uD7FF\uE000-\uFFFD\u10000-\u10FFFF]",
        string.Empty);
}

根据 XML 标准,它会删除有效字符值集之外的所有字符。

【讨论】:

    【解决方案3】:

    您无法解析无效的 XML,因为解析需要有效的 XML 结构。
    当您应该将文件读取为 UTF-8 或 UTF-16 时,您可能会以 ASCII 格式读取文件,这可能会导致您遇到问题。

    可能的解决方案:
    以 UTF-8 格式读取文件。

    【讨论】:

    • XDocument 如何确定用于读取文件的编码?是否有默认值,如何更改它以尝试 UTF8 或 UTF16?
    • @Jimmy:如果 HABJAN 的解决方案不起作用,请报告。
    • 会的。该文件仍在处理中。
    【解决方案4】:

    XLIFF 文档一个 XML 文档。字符 0x00 不是有效的 XML 字符。无效 XML 不是 XML,因此您无法使用 XML 解析器读取它。

    现在格式正确是另一回事了,您可以使用 SAX 解析器来读取格式不正确但不是无效 XML 的 XML。

    符合 XML 规范的有效字符:

     #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
    

    更新

    建议的解决方案:预处理文件以删除无效字符。字符 \0 可以替换为空格,除非它有含义(是二进制),在这种情况下它需要采用 Base64 格式。

    【讨论】:

    • 请详细说明“格式不正确”和“无效”的区别。
    • 抱歉,它的格式很好,我的错误,已修复。格式正确:en.wikipedia.org/wiki/XML#Well-formedness_and_error-handling
    • @Aliostad:我不同意。该问题几乎 100% 确定是编码问题,可以通过读取具有正确编码的文件来解决。 \0 IS 在 XML 文件中有效,IF 文件以 UTF-16 或 Unicode 编码。澄清一下:它仅在传递给 XML 解析器的字符串中无效。
    • @Daniel。很有可能,但我们没有看到文件,所以我们只是猜测。
    • 你是对的,但我认为你的建议给了他错误的想法 :) 他可能会接受并搞砸他的文件......
    猜你喜欢
    • 2011-11-21
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多