我通过网络请求一个 XML 文档。Xdocument.Load(stream)
引发异常,因为 XML 包含,&
因此期望.;
&
我确实将流读取为字符串并替换&
为&
,但这破坏了所有其他正确编码的特殊字符,例如ø
.
有没有一种简单的方法可以在解析为之前对字符串中所有不允许的字符进行编码XDocument
?
我通过网络请求一个 XML 文档。Xdocument.Load(stream)
引发异常,因为 XML 包含,&
因此期望.;
&
我确实将流读取为字符串并替换&
为&
,但这破坏了所有其他正确编码的特殊字符,例如ø
.
有没有一种简单的方法可以在解析为之前对字符串中所有不允许的字符进行编码XDocument
?
在 xml 中尝试 CDATA 部分
CDATA 部分只能用在可以有文本节点的地方。
<foo><![CDATA[Here is some data including < , > or & etc) ]]></foo>
不鼓励这种方法!!原因在于你的问题!
(将 &&
依次替换>
为&gt;
)
除了使用正则表达式之外,更好的建议是修改生成此类未编码 XML 的源代码。
我遇到了(.NET)代码,它使用“字符串连接”来生成 XML!(而应该使用 XML-DOM)
如果您有权修改源代码,那么最好继续这样做.. 因为编码这种半编码的 XML 并不能完美地保证!
@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>
我所使用的只是子字符串、IndexOf、stringConcat 和递归函数调用。如果您不理解代码的任何部分,请告诉我。
我提供的示例 XML 也拥有父节点中的数据,这是一种 HTML 属性 .. 例如:如果标签<div>this is <b>bold</b> text</div>..
外部有特殊字符,我的代码会负责编码数据,即 &..<b>
请注意,我只对“&”进行了编码,并且..数据不能包含像“<”或“>”或单引号或双引号这样的字符。