我想解析以下XML
XmlElement costCenterElement2 = doc.CreateElement("CostCenter");
costCenterElement2.InnerXml =
"<CostCenterNumber>2</CostCenterNumber> <CostCenter>" +
"G&A: Fin & Acctng" +
"</CostCenter>";
但我发现了XML Exception
解析EntityName时发生错误。
答案 0 :(得分:7)
是的 - &
在XML中无效,需要转发到&
。
其他字符无效字符及其转义:
<
>
"e;
'
以下内容应该有效:
XmlElement costCenterElement2 = doc.CreateElement("CostCenter");
costCenterElement2.InnerXml =
"<CostCenterNumber>2</CostCenterNumber> <CostCenter>" +
"G&A: Fin & Acctng" +
"</CostCenter>";
但是,您确实应该创建CostCenterNumber
和CostCenter
作为元素,而不是InnerXml
。
答案 1 :(得分:2)
private string SanitizeXml(string source)
{
if (string.IsNullOrEmpty(source))
{
return source;
}
if (source.IndexOf('&') < 0)
{
return source;
}
StringBuilder result = new StringBuilder(source);
result = result.Replace("<", "<>lt;")
.Replace(">", "<>gt;")
.Replace("&", "<>amp;")
.Replace("'", "<>apos;")
.Replace(""", "<>quot;");
result = result.Replace("&", "&");
result = result.Replace("<>lt;", "<")
.Replace("<>gt;", ">")
.Replace("<>amp;", "&")
.Replace("<>apos;", "'")
.Replace("<>quot;", """);
return result.ToString();
}
答案 2 :(得分:1)
<强>更新强>
@thabet,如果字符串"<CostCenterNumber>...G&A: Fin & Acctng</CostCenter>"
作为参数进入,并且它应该表示要解析的XML,那么它必须是格式良好的XML才能开始。在你给出的例子中,它不是。 &
表示实体引用的开头,后跟实体名称,并由;
终止,&
从不出现在上面的字符串中。
如果给你整个字符串作为参数,其中一些是必须解析的标记(即开始/结束标记),其中一些可能包含不应该被解析的标记(即{{1没有干净可靠的方法来“逃避”后者,而不是逃避前者。您可以使用&
替换所有&
个字符,但这样做可能会意外地将 
转换为&#160;
,并且您生成的内容可能会出错。如果这是您的情况,那么您正在接收输入“XML”,其中标记与不可解析的文本混合在一起,最好的办法是告诉您从哪个人那里得到XML,它不是格式良好的,他们需要修复他们的输出。他们有办法做到这一点,这对标准的XML工具来说并不困难。
如果另一方面你有
<CostCenterNumber>2</CostCenterNumber>
<CostCenter>...</CostCenter>
与传递的字符串分开,您需要将传递的字符串作为子<CostCenter>
的文本内容插入,并且您知道它不被解析(不包含元素),那么您可以这样做:
<CostCenterNumber>
和<CostCenter>
作为元素<CostCenter>
eltCCN.InnerXml = "2";
textCC = doc.CreateText(argStr)
; eltCC.AppendChild(textCC);