unicode - XElement 和 UTF-8 问题

标签 unicode utf-8 linq-to-xml xelement

我有一个 .NET Web 服务(.asmx,而不是 .svc),它通过 HTTP POST 接受字符串。它接受的字符串是 xml 信息集,然后我通过 XElement.Parse 进行解析。解析为 XElement 实例后,我将一个节点添加到该实例内的元素之一。

我遇到的问题是,如果表示 xml 信息集的字符串由于某种原因出现,那么我向元素 XElement 添加节点会引发异常,例如“' ',十六进制值 0x06,是无效的字符。第 1 行,位置 40。”。我收到大量抛出的 0x(*) 错误。如果我不尝试向 XElement 添加节点,一切都会很好。以下是我添加元素的方法:

var prospect = doc.Element("prospect");
var provider = prospect.Element("provider");

provider.Add(new XElement("id",
    new XAttribute("reservation-code",
    reservationCode)
));

我应该在某处进行某种字符串转换吗?

最佳答案

XML 不允许某些 Unicode 字符。请参阅the XML 1.0 Specification 。不幸的是,在 XML 中也没有标准方法来转义这些字符。例如,由于格式正确性约束:合法字符,您无法使用 在有效的 XML 中对其进行转义(请参阅 character references )。

XElement.ToString() 已启用对这些字符的检查。然而,.NET 确实提供了一种关闭字符检查的方法。默认情况下,它在 System.Xml.XmlWriter 实例中处于关闭状态。因此以下代码将起作用:

    /// <summary>
    /// Returns the XML string of the <paramref name="xElement"/> WITHOUT CHARACTER CHECKING.
    /// </summary>
    /// <param name="xElement"></param>
    /// <returns></returns>
    public static string ToStringWithoutCharacterChecking(this XElement xElement)
    {
        using (System.IO.StringWriter stringWriter = new System.IO.StringWriter())
        {
            using (System.Xml.XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter))
            {
                xElement.WriteTo(xmlTextWriter);
            }
            return stringWriter.ToString();
        }
    }

但请注意,如果您使用 System.Xml.XmlWriterSettings 创建 System.Xml.XmlWriter 实例,则字符的默认值为 true检查。因此,如果您使用 System.Xml.XmlWriterSettings 并希望关闭字符检查,请使用:

XmlWriterSettings s = new XmlWriterSettings();
s.CheckCharacters = false;
using(XmlWriter w = XmlWriter.Create(..., s))
{
    //etc.
}

关于unicode - XElement 和 UTF-8 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5709831/

相关文章:

python - 在 Python 中编码 unicode 特殊字符(符号)?

c# - 使用 XML 获取所有同名元素的内容?

c# - XDocument.ToString() 删除 XML 编码标签

c++ - 如何在 C++ 中递归查找具有 Unicode 名称的文件?

ios - 如何知道两个表情符号是否会显示为一个表情符号?

php - 将 mysql 字符集更改为 utf8,数据库中已有的非拉丁字符现在不可读

java - OrientDB 在处理 Unicode、土耳其语和枚举时遇到问题

python - 使用 python 解析推文中的 unicode

c# - 如何使用 C# 从 XML 元素中删除命名空间

python - utf-8 中的汉字字符