默认情况下,
someXmlWriter.WriteElementString("my-tag", someString);
生成<my-tag />
我环顾XmlWriterSettings课程,寻找可能迫使作者生成<my-tag></my-tag>
但却找不到任何内容的选项。
是否有一种简单的方法可以强制XmlWriter使用“开放标记,关闭标记”而不是使用简写形式发布空元素?
修改:
是!我意识到关于XML有效性,这两个符号是等价的,有效的,所有......我正在使用遗留代码,使用Read()解析这样的XML,即在节点级别(!)并通过Read来解决问题()-ing在空节点上时...
因此,我的问题出现在限制此遗留代码的更改量的上下文中。这个问题确实与建议的this SO question重叠;然而,这里提供的选项都不适用于我的情况。
答案 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。