我正在网上索取XML文档。 Xdocument.Load(stream)
会引发异常,因为XML包含&
,因此需要;
&
。
我确实已将流读取为字符串并将&
替换为&
,但这打破了所有其他正确编码的特殊字符,例如ø
。
在解析为XDocument
之前,是否有一种简单的方法可以对字符串中所有不允许的字符进行编码?
答案 0 :(得分:0)
在xml中尝试CDATA部分
CDATA部分只能用于可以有文本节点的地方。
<foo><![CDATA[Here is some data including < , > or & etc) ]]></foo>
答案 1 :(得分:0)
不鼓励这种方法!!原因在于你的问题!
(替换&
并>
转为&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&</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&]]>
</root>
我所使用的是,substring,IndexOf,stringConcat和递归函数调用..如果您不理解代码的任何部分,请告诉我。
我提供的示例XML也拥有父节点中的数据,这是一种HTML属性.. ex:<div>this is <b>bold</b> text</div>..
我的代码负责编码<b>
标记之外的数据他们有特殊的性格,即&amp; ..
请注意,我负责编码'&amp;'只有和..数据不能有像'&lt;'这样的字符或'&gt;'或单引号或双引号..