簡體   English   中英

XML中的特殊字符

[英]special chars in XML

我想解析以下XML

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

但我發現XML異常

解析EntityName時發生錯誤。

是的- &在XML中無效,需要轉義為&amp;

其他字符無效字符及其轉義符:

  • <- &lt;
  • >- &gt;
  • “- &quote;
  • '- &apos;

以下應該工作:

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

但是,您實際上應該將CostCenterNumberCostCenter創建為元素而不是InnerXml

        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();
        }

更新:

@thabet,如果字符串"<CostCenterNumber>...G&A: Fin & Acctng</CostCenter>"作為參數進入,並且應該表示要解析的XML,則必須使用格式正確的XML來從...開始。 在您給出的示例中,事實並非如此。 &表示實體引用的開始,后跟實體名稱,並以;結尾; ,它永遠不會出現在上面的字符串中。

如果為您提供了整個字符串作為參數,其中有些是必須解析的標記(即開始/結束標記),而有些則可能包含不應解析的標記(即& ),則沒有干凈可靠的方式“逃避”后者而不逃避前者。 您可以將所有&字符替換為&amp; ,但這樣做可能會意外地使&#160; 進入&amp;#160; 並且您得到的內容將是錯誤的。 如果是這種情況,那么您將收到輸入“ XML”,其中標記與無法解析的文本混合在一起,最好的辦法是告訴從您那里獲得XML的人,該XML格式不正確,他們需要修復其輸出。 。 使用標准XML工具,他們可以通過多種方法做到這一點。

另一方面,如果您有

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

與傳遞的字符串分開,您需要將傳遞的字符串作為子<CostCenter>的文本內容<CostCenter> ,並且知道它不會被解析(不包含元素),那么您可以執行以下操作:

  • 創建<CostCenterNumber><CostCenter>作為元素
  • 使它們成為父級的<CostCenter>
  • 假設其中沒有標記的風險,請使用InnerXML設置CostCenterNumber的文本內容: eltCCN.InnerXml = "2";
  • 為子CostCenter元素創建一個Text節點子節點,其值為傳遞的字符串: textCC = doc.CreateText(argStr) ;
  • 將文本節點分配為CostCenter子元素的子元素: eltCC.AppendChild(textCC);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM