XML中的特殊字符

时间:2010-11-01 13:59:23

标签: c# xml

我想解析以下XML

XmlElement costCenterElement2 = doc.CreateElement("CostCenter");
costCenterElement2.InnerXml =
    "<CostCenterNumber>2</CostCenterNumber> <CostCenter>" +
    "G&A: Fin & Acctng" +
    "</CostCenter>";

但我发现了XML Exception

  

解析EntityName时发生错误。

3 个答案:

答案 0 :(得分:7)

是的 - &在XML中无效,需要转发到&amp;

其他字符无效字符及其转义:

  • &LT; - &lt;
  • &GT; - &gt;
  • “ -​​ &quote;
  • ' - &apos;

以下内容应该有效:

XmlElement costCenterElement2 = doc.CreateElement("CostCenter");
costCenterElement2.InnerXml =
  "<CostCenterNumber>2</CostCenterNumber> <CostCenter>" +
  "G&amp;A: Fin &amp; Acctng" +
  "</CostCenter>";

但是,您确实应该创建CostCenterNumberCostCenter作为元素,而不是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;", "<>lt;")
                            .Replace("&gt;", "<>gt;")
                            .Replace("&amp;", "<>amp;")
                            .Replace("&apos;", "<>apos;")
                            .Replace("&quot;", "<>quot;");
            result = result.Replace("&", "&amp;");
            result = result.Replace("<>lt;", "&lt;")
                            .Replace("<>gt;", "&gt;")
                            .Replace("<>amp;", "&amp;")
                            .Replace("<>apos;", "&apos;")
                            .Replace("<>quot;", "&quot;");

            return result.ToString();
        }

答案 2 :(得分:1)

<强>更新

@thabet,如果字符串"<CostCenterNumber>...G&A: Fin & Acctng</CostCenter>"作为参数进入,并且它应该表示要解析的XML,那么它必须是格式良好的XML才能开始。在你给出的例子中,它不是。 &表示实体引用的开头,后跟实体名称,并由;终止,&从不出现在上面的字符串中。

如果给你整个字符串作为参数,其中一些是必须解析的标记(即开始/结束标记),其中一些可能包含不应该被解析的标记(即{{1没有干净可靠的方法来“逃避”后者,而不是逃避前者。您可以使用&替换所有&amp;个字符,但这样做可能会意外地将&#160;转换为&amp;#160;,并且您生成的内容可能会出错。如果这是您的情况,那么您正在接收输入“XML”,其中标记与不可解析的文本混合在一起,最好的办法是告诉您从哪个人那里得到XML,它不是格式良好的,他们需要修复他们的输出。他们有办法做到这一点,这对标准的XML工具来说并不困难。

如果另一方面你有

<CostCenterNumber>2</CostCenterNumber>
<CostCenter>...</CostCenter>

与传递的字符串分开,您需要将传递的字符串作为子<CostCenter>的文本内容插入,并且您知道它不被解析(不包含元素),那么您可以这样做:

  • 创建<CostCenterNumber><CostCenter>作为元素
  • 让他们成为父<CostCenter>
  • 的孩子
  • 假设不存在标记风险,使用InnerXML设置CostCenterNumber的文本内容:eltCCN.InnerXml = "2";
  • 为子CostCenter元素创建一个Text节点子节点,其值为传递的字符串:textCC = doc.CreateText(argStr);
  • 将该文本节点指定为子CostCenter元素的子节点:eltCC.AppendChild(textCC);