XElement& UTF-8问题

时间:2011-04-18 23:02:25

标签: 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)
));

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

2 个答案:

答案 0 :(得分:4)

XML不允许使用某些Unicode字符。见the XML 1.0 Specification。不幸的是,没有标准的方法来逃避XML中的这些字符。例如,由于格式良好约束:法律字符(请参阅character references),您无法使用	在有效XML中转义它。

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.XmlWriter创建System.Xml.XmlWriterSettings实例,则默认值为true以进行字符检查。因此,如果您使用System.Xml.XmlWriterSettings并想要关闭字符检查,请使用:

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

答案 1 :(得分:0)

非常感谢,当我使用linq到xsd时解决了我的问题。 这是我的代码: //不使用container.Save(new StreamWriter(toStream, new UTF8Encoding(false))); 而是使用代码:

using (XmlWriter w = XmlWriter.Create(new StreamWriter(toStream, new UTF8Encoding(false)), new XmlWriterSettings
            {//http://stackoverflow.com/questions/5709831/xelement-utf-8-issue
                //http://stackoverflow.com/questions/10057171/xdocument-prevent-invalid-charachters
                Indent = true,
                CheckCharacters = false
            }))
            {
                XTypedServices.Save(w, container.Untyped);
            }

            toStream.Flush();