【问题标题】:XElement & UTF-8 IssueXElement 和 UTF-8 问题
【发布时间】:2011-04-18 23:02:24
【问题描述】:

我有一个通过 HTTP POST 接受字符串的 .NET Web 服务(.asmx,而不是 .svc)。它接受的字符串是 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)
));

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

【问题讨论】:

  • reservationCode的类型和值是什么?
  • reservationCode 是一个基于字符串的 guid。 reservationCode 实际上是作为 Web 服务操作的第二个参数传入的另一个参数。我想将它注入到传递的xml中。

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


【解决方案1】:

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.
}

【讨论】:

    【解决方案2】:

    非常感谢,它解决了我在使用 linq to 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多