【问题标题】:How to write boolean attribute (specified - not specified) with XmlWriter?如何用 XmlWriter 编写布尔属性(指定 - 未指定)?
【发布时间】:2011-11-14 12:21:22
【问题描述】:

有没有办法写一个没有值的属性:

<element specified/>

我相信我可以做到:

writer.WriteRaw("<element specified/>")

但是有没有什么方法可以用 WriteAttributeString、WriteStartAttribute、WriteAttributes 或其他方法来做到这一点?

【问题讨论】:

  • &lt;element specified/&gt; 不是格式良好的 XML,任何 XML 软件都无法解析,它们都会引发错误。然而,它是有效的 SGML(有时是有效的 HTML)。使用 WriteRaw 是打破规则并编写非法 XML 的唯一方法。
  • @UnhandledException - “重复”问题与我写的问题无关 - 如何使用 XmlWriter 创建布尔属性

标签: .net xml xml-serialization xmlwriter


【解决方案1】:

如果您需要编写旧式 SGML 结构,您可以考虑使用 HtmlTextWriter 或其任何后代,例如 XhtmlTextWriter。它们的初衷是用于 ASP.NET,但由于它们是从 TextWriter 派生的,因此它们也应该可以在其他场景中使用。

如果您需要更大的灵活性,最好有一个 SGMLWriter。不幸的是,我只能找到SGMLReader

编辑

您可以创建一个 XmlWriter 来编写有效的 HTML 而不是有效的 XML,例如在 HTML 3.2 或 4.0 中。您可以通过使用反射覆盖OutputMethod 来做到这一点(据我所知,它是一个只读属性,否则它不会让您这样做)。示例:

XmlWriterSettings settings = new XmlWriterSettings();

// Use reflection, not that you need GetMethod, not GetProperty
MethodInfo propOutputMethod = settings.GetType().GetMethod("set_OutputMethod", 
    BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod);
propOutputMethod.Invoke(settings, new object[] { XmlOutputMethod.Html });

// check value, it should contain XmlOutputMethod.Html now
var outputMethod = settings.OutputMethod;

// continue as you used to do
StringBuilder builder = new StringBuilder();
XmlWriter writer = XmlWriter.Create(builder, settings);
writer.WriteStartDocument();
writer.WriteStartElement("html");
writer.WriteStartElement("input");
writer.WriteAttributeString("ismap", "value");
writer.WriteEndElement();
writer.WriteElementString("br", null);
writer.WriteElementString("img", null);
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Flush();

// variable output will now contain "<html><input ismap><br><img></html>"
string output = builder.ToString();

重要提示:这仅适用于预定义的属性和标签。据我所知,这只能通过 HTML 4.0 规范中定义为布尔值或不需要关闭的标签(br、img、hr 等)来完成。

此外,如果您尝试创建非法组合,它将使用标准语法。如果没有="",则无法强制使用布尔属性。即,这有效:&lt;input ismap&gt;,这无效&lt;inputs ismap=""&gt;&lt;/inputs&gt;

【讨论】:

  • 可能你是对的,我必须使用 HtmlTextWriter 之类的东西。我想知道 XmlWriterSettings.OutputMethod 只读属性接受 Xml、Text、Html。那么可能 XmlWriter 也允许编写格式不正确的 HTML?
  • @Vitaliy:我测试了将OutputMethod 设置为不同的值。它编写 HTML,但到目前为止它也是有效的 XHTML,我无法让它编写空的可选属性。但是,如果您查看文档,您会发现此设置仅由 .NET 的XsltProcessor 在内部使用。在内部,它使用HtmlUtf8RawTextWriter(隐藏类)。
  • 谢谢你的例子——这正是我想要的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多