[英]XElement & UTF-8 Issue
我有一个.NET Web服务(.asmx,而不是.svc),它通过HTTP POST接受字符串。 它接受的字符串是我随后通过XElement.Parse解析的xml信息集。 解析为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字符。 请参阅XML 1.0规范 。 不幸的是,也没有标准的方法可以将这些字符转义为XML。 例如,您不能使用	
以有效的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.XmlWriterSettings
创建System.Xml.XmlWriter
实例,则默认字符为true
。 因此,如果您使用System.Xml.XmlWriterSettings
并想关闭字符检查,请使用:
XmlWriterSettings s = new XmlWriterSettings();
s.CheckCharacters = false;
using(XmlWriter w = XmlWriter.Create(..., s))
{
//etc.
}
非常感谢,这在我使用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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.