Как написать логический атрибут (указан - не указан) с XmlWriter? - PullRequest
1 голос
/ 14 ноября 2011

Есть ли какой-нибудь возможный способ написать атрибут без значения:

<element specified/>

Я считаю, что могу сделать это с помощью:

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

Но есть ли способ сделать этос WriteAttributeString, WriteStartAttribute, WriteAttributes или другими методами?

1 Ответ

1 голос
/ 14 ноября 2011

Если вам нужно написать структуру 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 и т. Д.).

Кроме того, если вы попытаетесь создать недопустимые комбинации, он будет использовать стандартный синтаксис. Невозможно принудительно установить логический атрибут без ="". То есть, это работает: <input ismap>, это не <inputs ismap=""></inputs>.

...