如何用XmlWriter编写布尔属性(指定 - 未指定)?

时间:2011-11-14 12:21:22

标签: .net xml xml-serialization xmlwriter

是否有任何可能的方法来编写没有值的属性:

<element specified/>

我相信我能做到:

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

但是有没有办法用WriteAttributeString,WriteStartAttribute,WriteAttributes或其他方法呢?

1 个答案:

答案 0 :(得分:1)

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

如果您需要更多灵活性,那么拥有一个SGMLWriter会很不错。不幸的是,我只能找到SGMLReader

修改

您可以创建一个XmlWriter来编写无效XML的有效HTML,如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等)来完成。

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