如何正确编码&在xml?

时间:2012-11-30 17:05:34

标签: c# xml xml-parsing

我正在网上索取XML文档。 Xdocument.Load(stream)会引发异常,因为XML包含&,因此需要; &

我确实已将流读取为字符串并将&替换为&,但这打破了所有其他正确编码的特殊字符,例如ø

在解析为XDocument之前,是否有一种简单的方法可以对字符串中所有不允许的字符进行编码?

3 个答案:

答案 0 :(得分:0)

在xml中尝试CDATA部分

CDATA部分只能用于可以有文本节点的地方。

<foo><![CDATA[Here is some data including < , > or & etc) ]]></foo>

答案 1 :(得分:0)

不鼓励这种方法!!原因在于你的问题!

(替换&amp;&gt;转为&amp;gt;

除了使用正则表达式之外,更好的建议是修改生成此类未编码XML的源代码。
我遇到过(.NET)代码,使用'string concat'来提出XML! (而应该使用XML-DOM)  如果您有权修改源代码,那么最好再去那个..因为编码这样的半编码XML并不是完美的承诺!

答案 2 :(得分:0)

@espvar,

这是输入XML:

<root><child>nospecialchars</child><specialchild>data&data</specialchild><specialchild2>You.. & I in this beautiful world</specialchild2>data&amp;</root>

主要功能:

        string EncodedXML = encodeWithCDATA(XMLInput); //Calling our Custom function

        XmlDocument xdDoc = new XmlDocument();

        xdDoc.LoadXml(EncodedXML); //passed

函数encodeWithCDATA():

    private string encodeWithCDATA(string stringXML)
    {
        if (stringXML.IndexOf('&') != -1)
        {

            int indexofClosingtag = stringXML.Substring(0, stringXML.IndexOf('&')).LastIndexOf('>');
            int indexofNextOpeningtag = stringXML.Substring(indexofClosingtag).IndexOf('<');

            string CDATAsection = string.Concat("<![CDATA[", stringXML.Substring(indexofClosingtag, indexofNextOpeningtag), "]]>");

            string encodedLeftPart = string.Concat(stringXML.Substring(0, indexofClosingtag+1), CDATAsection);
            string UncodedRightPart = stringXML.Substring(indexofClosingtag+indexofNextOpeningtag);
            return (string.Concat(encodedLeftPart, encodeWithCDATA(UncodedRightPart)));
        }
        else
        {
            return (stringXML);
        }
    }

编码的XML(即xdDoc.OuterXml):

<root>
  <child>nospecialchars</child>
  <specialchild>
    <![CDATA[>data&data]]>
  </specialchild>
  <specialchild2>
    <![CDATA[>You.. & I in this beautiful world]]>
  </specialchild2>
  <![CDATA[>data&amp;]]>
</root>

我所使用的是,substring,IndexOf,stringConcat和递归函数调用..如果您不理解代码的任何部分,请告诉我。

我提供的示例XML也拥有父节点中的数据,这是一种HTML属性.. ex:<div>this is <b>bold</b> text</div>..我的代码负责编码<b>标记之外的数据他们有特殊的性格,即&amp; ..

请注意,我负责编码'&amp;'只有和..数据不能有像'&lt;'这样的字符或'&gt;'或单引号或双引号..