XDocument的特殊字符

时间:2014-01-31 19:36:26

标签: c# linq-to-xml encode

我正在尝试读取文件(不是XML,但结构类似),但我得到了这个例外:

'┴', hexadecimal value 0x15, is an invalid character. Line 8, position 7.

并且该文件有很多这样的符号,我无法替换,因为我不能为了我的目的修改文件的内容...

这就是代码:

try
{
    XDocument doc = new XDocument(new XDeclaration("1.0", "utf-16", "yes"));
    doc = XDocument.Load(arquivo);
}
catch (Exception e)
{
    MessageBox.Show(e.Message.ToString());
}

这是文件的一部分:

<Codepage>UTF16</Codepage>
<Segment>0000016125
    <Control>0003┴300000┴English(U.S.)PORTUGUESE┴┴bla.000┴webgui\messages\xsl\en\blabla\blabla.xlf
    </Control>
    <Source>To blablablah the   firewall to blablablah local IP address.    </Source>
    <Target>Para blablablah a uma blablablah local específico.  </Target>
</Segment>

注意:该文件没有encode xml声明。

1 个答案:

答案 0 :(得分:2)

这个XML非常糟糕;

  1. 你有<Segment>0000016125,虽然在技术上并非违法(它是一个文本节点),但它有点奇怪。
  2. 您的<Control>元素包含无字符,但没有XML CDATA部分
  3. 您可以手动规范化XML,也可以通过字符串操作或RegEx或类似方式在C#中进行规范化。

    在您的简单示例中,只有<Control>元素包含无效字符;因此,修复它并使用CDATA方法添加string.Replace()部分相对简单,使它看起来像这样:

    <Control><![CDATA[0003┴300000┴English(U.S.)PORTUGUESE┴┴bla.000┴webgui\messages\xsl\en\blabla\blabla.xlf]]></Control>
    

    然后,您可以使用XDocument

    将好的XML加载到XDocument.Parse(string xml)
    string badXml = @"
        <temproot>
            <Codepage>UTF16</Codepage>
            <Segment>0000016125
                <Control>0003┴300000┴English(U.S.)PORTUGUESE┴┴bla.000┴webgui\messages\xsl\en\blabla\blabla.xlf</Control>
                <Source>To blablablah the   firewall to blablablah local IP address.    </Source>
                <Target>Para blablablah a uma blablablah local específico.  </Target>
            </Segment>
        </temproot>";
    
    // assuming only <control> element has the invalid characters
    string goodXml = badXml
        .Replace("<Control>", "<Control><![CDATA[")
        .Replace("</Control>", "]]></Control>");
    
    XDocument xDoc = XDocument.Parse(goodXml);
    xDoc.Declaration = new XDeclaration("1.0", "utf-16", "yes");
    
    // do stuff with xDoc