在元素中包含XML CDATA

时间:2016-04-20 01:35:14

标签: c# xml visual-studio

更新:为每个请求添加了更多详细信息

我正在尝试为我的应用程序创建一个xml配置文件。该文件包含要在html文档中搜索和替换的条件列表。问题是,我需要搜索像&nbsp这样的字符串。我不希望我的代码读取已解码的项目,而是文本本身。

承认自己是XML的新手,我确实尝试过满足要求。我在Stackoverflow上阅读了关于CDATAATTRIBUTES的大量链接等等,但这里(以及其他地方)的示例似乎侧重于在xml文件中创建一行而不是多行。< / p>

以下是我做过的许多尝试之一无济于事:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE item [
  <!ELEMENT item (id, replacewith)>
  <!ELEMENT id (#CDATA)>
  <!ELEMENT replacewith (#CDATA)>
  ]>
]>
<item id=" " replacewith="&nbsp;">Non breaking space</item>
<item id="&#8209;" replacewith="-">Non breaking hyphen</item>

本文档给出了一些错误,包括:

  • 在DOCTYPE中,我收到<!ELEMENT id (#CDATA)>之类的错误。在CDATA领域,Visual Studio告诉我它正在期待一个&#39;&#39;或&#39; |&#39;。
  • ]>误给我invalid token at the root of the document
  • 当然,在第二次<item条目之后,我收到一条错误,指出XML document cannot contain multiple root level elements

如何编写包含多个项的xml文件允许我存储和检索元素中的文本,而不是解释的字符?

如果它有帮助,我使用.Net,C#和Visual Studio。

修改 这个xml文件的目的是为我的代码提供一个在html文件中搜索和替换的东西列表。 xml文件只包含what to search forwhat to replace with的列表。

这是我现在的文件:

<?xml version="1.0" encoding="utf-8" ?>
<Items>
  <item id="&#8209;" replacewith="-">Non breaking hyphen</item>
  <item id=" " replacewith="&nbsp;">Non breaking hyphen</item>
</Items>

使用第一个作为示例,我想阅读文本&#8209,但是当我读到这篇文章时,我得到-,因为这就是代码所代表的内容。

您可以提供的任何帮助或指示都会有所帮助。

1 个答案:

答案 0 :(得分:1)

详细说明我的评论:由于保留字符,XML就像HTML一样。当使用任何类型的解析器(浏览器,XML读取器等)读入时,&符号前缀关键字或字符代码将转换为文字字符串。

转义值的最简单方法是确保将它们作为您想要的文字读回来,就像将它们编码为Web一样。例如,要创建XML文档,我这样做了:

     XmlDocument xmlDoc = new XmlDocument();
     XmlElement xmlItem;
     XmlAttribute xmlAttr;
     XmlText xmlText;

     // Declaration
     XmlDeclaration xmlDec = xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", null);
     XmlElement xmlRoot = xmlDoc.DocumentElement;
     xmlDoc.InsertBefore(xmlDec, xmlRoot);

     // Items
     XmlElement xmlItems = xmlDoc.CreateElement(string.Empty, "Items", string.Empty);
     xmlDoc.AppendChild(xmlItems);

     // Item #1
     xmlItem = xmlDoc.CreateElement(string.Empty, "item", string.Empty);
     xmlAttr = xmlDoc.CreateAttribute(string.Empty, "id", string.Empty);
     xmlAttr.Value = "&#8209;";
     xmlItem.Attributes.Append(xmlAttr);
     xmlAttr = xmlDoc.CreateAttribute(string.Empty, "replacewith", string.Empty);
     xmlAttr.Value = "-";
     xmlItem.Attributes.Append(xmlAttr);
     xmlText = xmlDoc.CreateTextNode("Non breaking hyphen");
     xmlItem.AppendChild(xmlText);

     xmlItems.AppendChild(xmlItem);

     // Item #2
     xmlItem = xmlDoc.CreateElement(string.Empty, "item", string.Empty);
     xmlAttr = xmlDoc.CreateAttribute(string.Empty, "id", string.Empty);
     xmlAttr.Value = " ";
     xmlItem.Attributes.Append(xmlAttr);
     xmlAttr = xmlDoc.CreateAttribute(string.Empty, "replacewith", string.Empty);
     xmlAttr.Value = "&nbsp;";
     xmlItem.Attributes.Append(xmlAttr);
     xmlText = xmlDoc.CreateTextNode("Non breaking hyphen");
     xmlItem.AppendChild(xmlText);

     xmlItems.AppendChild(xmlItem);

     // For formatting
     StringBuilder xmlBuilder = new StringBuilder();
     XmlWriterSettings xmlSettings = new XmlWriterSettings
     {
        Indent = true,
        IndentChars = "  ",
        NewLineChars = "\r\n",
        NewLineHandling = NewLineHandling.Replace
     };
     using (XmlWriter writer = XmlWriter.Create(xmlBuilder, xmlSettings))
     {
        xmlDoc.Save(writer);
     }

     xmlOutput.Text = xmlBuilder.ToString();

请注意,我根据您的期望输入了id值。现在,看看它是如何编码的:

<?xml version="1.0" encoding="utf-16"?>
<Items>
  <item id="&amp;#8209;" replacewith="-">Non breaking hyphen</item>
  <item id=" " replacewith="&amp;nbsp;">Non breaking hyphen</item>
</Items>

你和这个之间的唯一区别是&符编码为&amp;,其余的仍然是字符串文字。这是XML的正常行为。当您重新阅读时,它会以文字&#8209;&nbsp;的形式返回。