我有一个 .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 字符。请参阅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.XmlWriter
创建 System.Xml.XmlWriterSettings
实例,则默认为 true
用于字符检查。因此,如果您使用 System.Xml.XmlWriterSettings
并想要关闭字符检查,请使用:
XmlWriterSettings s = new XmlWriterSettings();
s.CheckCharacters = false;
using(XmlWriter w = XmlWriter.Create(..., s))
{
//etc.
}
非常感谢,这解决了我使用 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();