使用XDocument时禁用XML验证

时间:2011-03-31 09:13:25

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

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

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

E.g。

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

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

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

感谢。

4 个答案:

答案 0 :(得分:5)

我有类似的问题,通过让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"));

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

答案 1 :(得分:4)

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

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

根据XML标准,它删除任何超出有效字符值集的字符。

答案 2 :(得分:2)

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

可能的解决方案:
将文件读为UTF-8。

答案 3 :(得分:2)

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

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

符合XML规范的有效字符:

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

更新

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