我有一个XML文档,其中包含一个子节点中的一些c#代码。 c#代码:
for (int i = 0; i <= 20; i++) { }
现在这个c#代码由于'='字符而导致XML解析错误。我可以将其替换为xml特殊字符(&amp;#..),但是当使用我的eval函数调试时,我的c#代码将无法正常运行(获取字符串并在流上执行它)。如何在我的xml文件中允许c#代码而不会导致xml解析错误,同时仍然能够解析正常工作的c#代码?
PS。我不是XML专家所以如果问题与xml有关,这个问题可能很容易。
答案 0 :(得分:1)
当你说
时我可以将其替换为xml特殊字符(&amp;#..),但随后我的c#代码将无法正常运行
然后我认为你误解了编码。假设你没有包含在<!CDATA[ ]]>
中,那么是的,你应该编码诸如&lt;之前的字符。到&gt;插入文本(或您的案例中的代码)时。但是,这并不意味着当你解析&#34;回到内容,你会看到&amp; gt;标志。将数据写入xml节点时,它会被编码。当你解析&#34;它回来了,内容再次被解码,你得到原始文本。
这假设您正在使用标准的xml解析器,我强烈建议。
答案 1 :(得分:0)
在XML中,有一些方法可以转义特殊字符,否则会破坏文档(例如&lt;和=)。
在这种情况下,您最好的选择是做这样的事情:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<code>
<![CDATA[
for (int i = 0; i <= 20; i++) { }
]]>
</code>
</root>
您可以在&lt;![CDATA [...]]&gt;内放置任何内容阻止(除了]]&gt;),它不会破坏XML文档。
答案 2 :(得分:0)
您可以使用CDATA部分或编码字符。这并不重要,因为C#具有以任何方式解析XML的类,并为您提供解码后的字符串。
这是如何在C#中的XmlDocument中生成CDATA部分的粗略示例:
var xmlDocument = new System.Xml.XmlDocument();
xmlDocument.LoadXml("<xml></xml>");
var xmlCDataSection = xmlDocument.CreateCDataSection("for (int i = 0; i <= 20; i++) { }");
var root = xmlDocument.DocumentElement;
root.AppendChild(xmlCDataSection);
xmlDocument.Save("d:\\example.xml");
结果
<xml><![CDATA[for (int i = 0; i <= 20; i++) { }]]></xml>
如果XML不需要是人类可读的,那么可以不使用CDATA部分,在这种情况下,XmlDoucment将对字符进行编码,并在您重新读取XML时解码它们。 / p>
即
var xmlDocument = new System.Xml.XmlDocument();
var xmlElement = xmlDocument.CreateElement("xml");
xmlElement.InnerText = "for (int i = 0; i <= 20; i++) { }";
xmlDocument.AppendChild(xmlElement);
xmlDocument.Save("d:\\example.xml");
结果
<xml>for (int i = 0; i <= 20; i++) { }</xml>