将 XML 设置为 XML 节点属性的值
Set XML as value of an XML node attribute
我正在尝试在 C#
中创建一个 XML
文档,其中一个属性将获得另一个 XML 作为值:
XmlDocument doc = new XmlDocument();
XmlElement nodElement = doc.CreateElement(string.Empty, "node", string.Empty);
nodElement.SetAttribute("text", MyXMLToInsert);
doc.AppendChild(nodElement);
MyXMLToInsert
会是这样的:
<xml xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns:m="http://schemas.microsoft.com/office/2004/12/omml"
xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
.
.
如何防止第二个XML的特殊字符与主要字符不冲突?
谢谢。
调用 SetAttribute 方法将转义数据。
假设您从应用程序根目录中的文件 "Text.txt" 中读取了 MyXMLToInsert 的内容。
var doc = new XmlDocument();
var nodElement = doc.CreateElement(string.Empty, "node", string.Empty);
nodElement.SetAttribute("text", File.ReadAllText("text.txt"));
doc.AppendChild(nodElement);
属性的值将自动转义(使用 XML 转义码)到...
<node text="<xml xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns:m="http://schemas.microsoft.com/office/2004/12/omml"
xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">" />
Different ways how to escape an XML string in C#
如果必须在 XML 文档中保存 XML 文本,则需要 XML 编码。如果您不转义特殊字符,要插入的 XML 将成为原始 XML DOM 的一部分,而不是节点的值。
转义 XML 意味着基本上用新值替换 5 个字符。
这些替换是:
< -> <
> -> >
" -> "
' -> '
& -> &
您可以通过以下 4 种方式在 C# 中对 XML 进行编码:
string.Replace() 5 times
这很丑陋,但很管用。请注意 Replace("&", "&") 必须是第一个替换,因此我们不会替换其他已经转义的 &.
string xml = "<node>it's my \"node\" & i like it<node>";
encodedXml = xml.Replace("&", "&").Replace("<", "<").Replace(">", ">").Replace("\"", """).Replace("'", "'");
// RESULT: <node>it's my "node" & i like it<node>
System.Web.HttpUtility.HtmlEncode()
用于编码 HTML,但 HTML 是 XML 的一种形式,因此我们也可以使用它。主要用于 ASP.NET 应用。请注意,HtmlEncode 不会对撇号 (') 进行编码。
string xml = "<node>it's my \"node\" & i like it<node>";
string encodedXml = HttpUtility.HtmlEncode(xml);
// RESULT: <node>it's my "node" & i like it<node>
System.Security.SecurityElement.Escape()
在 Windows 表单或控制台应用程序中,我使用此方法。如果没有别的,它可以节省我的时间,包括我项目中的 System.Web 引用,并且它对所有 5 个字符进行编码。
string xml = "<node>it's my \"node\" & i like it<node>";
string encodedXml = System.Security.SecurityElement.Escape(xml);
// RESULT: <node>it's my "node" & i like it<node>
System.Xml.XmlTextWriter
使用 XmlTextWriter,您不必担心转义任何内容,因为它会在需要的地方转义字符。例如,在属性中它不会转义撇号,而在节点值中它不会转义撇号和引号。
string xml = "<node>it's my \"node\" & i like it<node>";
using (XmlTextWriter xtw = new XmlTextWriter(@"c:\xmlTest.xml", Encoding.Unicode))
{
xtw.WriteStartElement("xmlEncodeTest");
xtw.WriteAttributeString("testAttribute", xml);
xtw.WriteString(xml);
xtw.WriteEndElement();
}
// RESULT:
/*
<xmlEncodeTest testAttribute="<node>it's my "node" & i like it<node>">
<node>it's my "node" & i like it<node>
</xmlEncodeTest>
*/
我正在尝试在 C#
中创建一个 XML
文档,其中一个属性将获得另一个 XML 作为值:
XmlDocument doc = new XmlDocument();
XmlElement nodElement = doc.CreateElement(string.Empty, "node", string.Empty);
nodElement.SetAttribute("text", MyXMLToInsert);
doc.AppendChild(nodElement);
MyXMLToInsert
会是这样的:
<xml xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns:m="http://schemas.microsoft.com/office/2004/12/omml"
xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
.
.
如何防止第二个XML的特殊字符与主要字符不冲突? 谢谢。
调用 SetAttribute 方法将转义数据。
假设您从应用程序根目录中的文件 "Text.txt" 中读取了 MyXMLToInsert 的内容。
var doc = new XmlDocument();
var nodElement = doc.CreateElement(string.Empty, "node", string.Empty);
nodElement.SetAttribute("text", File.ReadAllText("text.txt"));
doc.AppendChild(nodElement);
属性的值将自动转义(使用 XML 转义码)到...
<node text="<xml xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns:m="http://schemas.microsoft.com/office/2004/12/omml"
xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">" />
Different ways how to escape an XML string in C#
如果必须在 XML 文档中保存 XML 文本,则需要XML 编码。如果您不转义特殊字符,要插入的 XML 将成为原始 XML DOM 的一部分,而不是节点的值。
转义 XML 意味着基本上用新值替换 5 个字符。
这些替换是:
< -> <
> -> >
" -> "
' -> '
& -> &
您可以通过以下 4 种方式在 C# 中对 XML 进行编码:
string.Replace() 5 times
这很丑陋,但很管用。请注意 Replace("&", "&") 必须是第一个替换,因此我们不会替换其他已经转义的 &.
string xml = "<node>it's my \"node\" & i like it<node>";
encodedXml = xml.Replace("&", "&").Replace("<", "<").Replace(">", ">").Replace("\"", """).Replace("'", "'");
// RESULT: <node>it's my "node" & i like it<node>
System.Web.HttpUtility.HtmlEncode()
用于编码 HTML,但 HTML 是 XML 的一种形式,因此我们也可以使用它。主要用于 ASP.NET 应用。请注意,HtmlEncode 不会对撇号 (') 进行编码。
string xml = "<node>it's my \"node\" & i like it<node>";
string encodedXml = HttpUtility.HtmlEncode(xml);
// RESULT: <node>it's my "node" & i like it<node>
System.Security.SecurityElement.Escape()
在 Windows 表单或控制台应用程序中,我使用此方法。如果没有别的,它可以节省我的时间,包括我项目中的 System.Web 引用,并且它对所有 5 个字符进行编码。
string xml = "<node>it's my \"node\" & i like it<node>";
string encodedXml = System.Security.SecurityElement.Escape(xml);
// RESULT: <node>it's my "node" & i like it<node>
System.Xml.XmlTextWriter
使用 XmlTextWriter,您不必担心转义任何内容,因为它会在需要的地方转义字符。例如,在属性中它不会转义撇号,而在节点值中它不会转义撇号和引号。
string xml = "<node>it's my \"node\" & i like it<node>";
using (XmlTextWriter xtw = new XmlTextWriter(@"c:\xmlTest.xml", Encoding.Unicode))
{
xtw.WriteStartElement("xmlEncodeTest");
xtw.WriteAttributeString("testAttribute", xml);
xtw.WriteString(xml);
xtw.WriteEndElement();
}
// RESULT:
/*
<xmlEncodeTest testAttribute="<node>it's my "node" & i like it<node>">
<node>it's my "node" & i like it<node>
</xmlEncodeTest>
*/