【问题标题】:Is closing tag ">" a valid character in xml?结束标记“>”是 xml 中的有效字符吗?
【发布时间】:2015-01-05 08:30:22
【问题描述】:

###################

更新:感谢 user2622016,我认为“>”是有效的。

现在,在我的 c# 代码中,我有一个类,其中一个字段以 ">" 作为其值。 我想将类序列化为 xml WITHOUT ">" 被转义到 > 。 我正在使用 xmlSerializer 类。我的代码是:

 memoryStream = new System.IO.MemoryStream();
                System.Xml.XmlWriterSettings xmlWriterSettings = new System.Xml.XmlWriterSettings();
                xmlWriterSettings.Encoding = encoding;
                xmlWriterSettings.Indent = true;
                System.Xml.XmlWriter xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings);
                Serializer.Serialize(xmlWriter, myObj);

任何想法如何在不使用“writeRaw”编写整个 XML 的情况下实现这一点(因为我希望整个类都被序列化)?

###################

“>”是 XML 中的有效字符吗?

简单的答案是否定的。根据我所知道的一切.. (另外,Invalid Characters in XML

但是当我尝试使用在线可用的 xml 验证工具进行检查时 喜欢:http://www.w3schools.com/xml/xml_validator.asphttp://www.xmlvalidation.com/

它说以下 xml 是有效的:

<?xml version="1.0" encoding="utf-8"?>
<object>
   <innerObj attrib="myAttrib">invalid char is > why valid</innerObj >
</object>

这怎么可能?

(我问的原因,我试图将此 xml 作为 c# 中的一个类并对其进行序列化。显然它转义“>”到"&amp;gt;"。我不希望它发生..

关于这个“有效无效”字符以及如何解决我的序列化问题的任何解释? )

谢谢!!!

【问题讨论】:

  • 为什么不想被替换? Is is recommended to do that(参见实体参考部分)
  • “我不希望它发生” ...当您不想要有效的 XML 时,请使用其他内容。
  • 看@user2622016 的回答,这是有效的。它在我班级的字段中,我希望它在序列化时保持“>”。
  • 仍然无法理解问题所在。当您序列化 &amp;gt; 时,它将在您的 xml 中替换为 &amp;gt;。当你反序列化它时,你会得到&amp;gt;。你想在xml中看到&amp;gt;吗?但是当你有&lt;&gt;时你会怎么做?
  • 右尖括号 (>) 可以使用字符串“&amp;gt;”来表示。句号。 读者可以将&amp;gt;&amp;gt; 正确解释为&amp;gt;。出于美学原因,您希望它保持纯文本形式,对吗?

标签: c# xml validation serialization invalid-characters


【解决方案1】:

只有和号 (&) 和左尖括号 ( '大于' 在 xml 文本字段中绝对可以,因为它不会使其模棱两可。 见第2.4章http://www.w3.org/TR/2008/REC-xml-20081126/#syntax

& 符号 (&) 和左尖括号 (右尖括号 (>) 可以使用 字符串“&amp;gt;”,并且为了兼容性,必须使用以下任一方法进行转义 "&amp;gt;" 或出现在字符串 " ]]> 中的字符引用 " 在内容中,当该字符串未标记 CDATA 的结尾时 部分。

为什么 C# 总是将其转义为 &amp;gt?我不知道,也许是为了与以前的一些实现兼容?

根据标准,实现者可以根据自己的意愿转义>为&amp;gt,但仅需要结合]]&gt;这样做

【讨论】:

  • 既然它是有效的,就像你说的。我希望它按原样编写而不是转义,当我使用 xmlSerializer 类将其从类对象序列化为 xml 时,它会被转义。代码:memoryStream = new System.IO.MemoryStream(); System.Xml.XmlWriterSettings xmlWriterSettings = new System.Xml.XmlWriterSettings(); xmlWriterSettings.Encoding = 编码; xmlWriterSettings.Indent = true; System.Xml.XmlWriter xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings); Serializer.Serialize(xmlWriter, myObj);
【解决方案2】:

您可以使用 CDATA。试试这个

<?xml version="1.0" encoding="utf-8"?>
<object>
  <innerObj attrib="myAttrib">invalid char is <![CDATA[>]]> why valid</innerObj >
</object>

【讨论】:

    猜你喜欢
    • 2011-10-27
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多