我们可以强制XmlWriter发出<my-tag> </my-tag>而不是<my-tag>吗?</my-tag>

时间:2012-01-25 21:16:39

标签: .net xml xmlwriter

默认情况下,

someXmlWriter.WriteElementString("my-tag", someString);

生成<my-tag />

我环顾XmlWriterSettings课程,寻找可能迫使作者生成<my-tag></my-tag>但却找不到任何内容的选项。

是否有一种简单的方法可以强制XmlWriter使用“开放标记,关闭标记”而不是使用简写形式发布空元素?

修改
是!我意识到关于XML有效性,这两个符号是等价的,有效的,所有......我正在使用遗留代码,使用Read()解析这样的XML,即在节点级别(!)并通过Read来解决问题()-ing在空节点上时...

因此,我的问题出现在限制此遗留代码的更改量的上下文中。这个问题确实与建议的this SO question重叠;然而,这里提供的选项都不适用于我的情况。

8 个答案:

答案 0 :(得分:18)

这对我有用:

writer.WriteStartElement("my-tag");
writer.WriteRaw(someString);
writer.WriteFullEndElement();

WriteEndElement仍然自动关闭标记

答案 1 :(得分:3)

如果您收到消息Extension method can only be declared in non-generic, non-nested static class,因为单词this可能会突出显示,只需创建一个扩展类,如下所示:

public static class Extension
{
    public static void WriteFullElementString(this XmlTextWriter writer, string localName, string value)
    {
        writer.WriteStartElement(localName);
        writer.WriteRaw(value);
        writer.WriteFullEndElement();
    }
}

希望这证明有用: - )

答案 2 :(得分:2)

试试这个:

x.WriteStartElement("my-tag"); 

//Value of your tag is null

If (<"my-tag"> == "")

{
  x.WriteWhitespace("");
}else
  x.WriteString(my-tag);

x.WriteEndElement();

答案 3 :(得分:1)

你有没有试过这样的事情:

if (someString.Length > 0)
{
  someXmlWriter.WriteElementString("my-tag", someString);
}
else
{
  someXmlWriter.WriteStartElement("my-tag");
  someXmlWriter.WriteEndElement("my-tag");
}

也许将一个实用程序类作为成员函数。

答案 4 :(得分:1)

将此留在这里以防有人需要它;因为上面的答案都没有为我解决,或者看起来有点矫枉过正。

    FileStream fs = new FileStream("file.xml", FileMode.Create);
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    XmlWriter w = XmlWriter.Create(fs, settings);
    w.WriteStartDocument();
    w.WriteStartElement("tag1");

        w.WriteStartElement("tag2");
        w.WriteAttributeString("attr1", "val1");
        w.WriteAttributeString("attr2", "val2");
        w.WriteFullEndElement();

    w.WriteEndElement();
    w.WriteEndDocument();
    w.Flush();
    fs.Close();

诀窍是设置 XmlWriterSettings.Indent = true 并将其添加到 XmlWriter 。< / p>

编辑:

或者您也可以使用

w.Formatting = Formatting.Indented;

而不是添加XmlWriterSettings。

答案 5 :(得分:1)

我使用下一个代码:

if (string.IsNullOrEmpty(myStringValue))
{
   myWriter.WriteStartElement("mytag");
   myWriter.WriteFullEndElement();
}
else
{
   myWriter.WriteElementString("mytag", myStringValue);
}

答案 6 :(得分:0)

我刚刚遇到了同样的问题,虽然它看起来像是一种黑客攻击,但它确实起作用,并且对我必须使用的现有代码非常不引人注意。

private static XElement MakeElementLongHand(this XElement rootElem)
{
   rootElem.Value = " ";
   rootElem.Value = string.Empty;
   return rootElem;
}

答案 7 :(得分:-10)

在.Net中没有选项设置。它们是相同的,任何解析器都应该能够处理有效的XML。