【问题标题】:Special characters with XDocumentXDocument 的特殊字符
【发布时间】:2014-02-24 15:33:58
【问题描述】:

我正在尝试读取一个文件(不是 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>

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

【问题讨论】:

  • 您为什么要尝试使用 XML 解析器读取非 XML 文件?
  • 嗨@MarcinJuraszek,因为这个:stackoverflow.com/questions/21465568/…,结构非常相似,谢谢
  • 结构可能类似,但有效的是有效的XML,无效的是无效的XML。

标签: c# linq-to-xml encode


【解决方案1】:

这个 XML 很糟糕;

  1. 你有&lt;Segment&gt;0000016125,虽然在技术上不是非法的(它是一个文本节点),但有点奇怪。
  2. 您的 &lt;Control&gt; 元素包含无效字符且没有 XML CDATA 部分

您可以手动规范化 XML 或在 C# 中通过字符串操作、RegEx 或类似的方式进行规范化。

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

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

然后您可以使用 XDocument.Parse(string xml) 将好的 XML 加载到您的 XDocument 中:

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

【讨论】:

    猜你喜欢
    • 2014-11-03
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2016-02-09
    相关资源
    最近更新 更多