解析XML文档以获得c#代码

本文关键字:代码 XML 文档 解析 | 更新日期: 2023-09-27 18:27:25

我有一个XML文档,它的一个子节点中包含一些c#代码。c#代码:

for (int i = 0; i <= 20; i++) { }

现在,由于"="字符,此c#代码导致XML解析错误。我可以用xml特殊字符(&#..)代替它,但当用我的eval函数进行调试时,我的c代码将无法正常运行(需要一个字符串并在流上执行)。如何在不导致xml解析错误的情况下允许在xml文件中使用c#代码,同时仍然能够解析正常工作的c#代码?

PS。我不是XML专家,所以如果问题与XML有关,这个问题可能很容易解决。

解析XML文档以获得c#代码

当你说时

我可以用一个xml特殊字符(&#…)代替它,但我的c代码将无法再正常运行

那我想你误解了编码。假设您不包含在<!CDATA[ ]]>中,那么是的,您应该对<至>插入文本时(或在您的情况下插入代码)。然而,这并不意味着当你"解析"回内容时,你会看到一个&gt;当您将数据写入xml节点时,它会被编码。当你把它"解析"回来时,内容会被再次解码,你会得到原始文本。

这假设您使用的是标准的xml解析器,我强烈建议您这样做。

在XML中,有一些方法可以转义特殊字符,否则这些字符会破坏文档(如<和=)。

在这种情况下,你最好的选择是这样做:

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <code>
    <![CDATA[
      for (int i = 0; i <= 20; i++) { }
    ]]>
  </code>
</root>

你可以在<![CDATA[…]>块(除了]]>),它不会破坏XML文档。

您可以使用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时对其进行解码。

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 &lt;= 20; i++) { }</xml>