.net 我们是否可以强制XmlWriter发布<;我的标签></我的标签>;而不是<;我的标签/>;?
默认情况下.net 我们是否可以强制XmlWriter发布<;我的标签></我的标签>;而不是<;我的标签/>;?,.net,xml,xmlwriter,.net,Xml,Xmlwriter,默认情况下 someXmlWriter.WriteElementString("my-tag", someString); 产生 我在类中查找可能的选项,这些选项会迫使编写器生成,但没有找到任何内容 有没有一种简单的方法可以强迫用户使用“open-tag,close-tag”而不是简写形式来发布空元素 编辑: 对我意识到,就XML有效性而言,这两种符号是等价的、有效的,并且都是。。。但是,我正在使用遗留代码,该代码使用Read()解析此类XML,即在节点级别(!),并在空节点上通过Read()
someXmlWriter.WriteElementString("my-tag", someString);
产生
我在类中查找可能的选项,这些选项会迫使编写器生成
,但没有找到任何内容
有没有一种简单的方法可以强迫用户使用“open-tag,close-tag”而不是简写形式来发布空元素
编辑:对我意识到,就XML有效性而言,这两种符号是等价的、有效的,并且都是。。。但是,我正在使用遗留代码,该代码使用Read()解析此类XML,即在节点级别(!),并在空节点上通过Read()-ing进行摸索…
因此,我的问题是在限制此遗留代码的更改量的背景下提出的。这个问题确实与所建议的重叠;但是,这里提供的选项都不适合我的情况。您是否尝试过类似的方法:
if (someString.Length > 0)
{
someXmlWriter.WriteElementString("my-tag", someString);
}
else
{
someXmlWriter.WriteStartElement("my-tag");
someXmlWriter.WriteEndElement("my-tag");
}
也许可以用它作为成员函数创建一个实用程序类。这对我来说很有用:
writer.WriteStartElement("my-tag");
writer.WriteRaw(someString);
writer.WriteFullEndElement();
WriteEndElement仍然自动关闭标记我刚刚遇到了完全相同的问题,虽然它看起来像是一种黑客行为,但它确实起了作用,并且对我必须使用的现有代码非常不友好
private static XElement MakeElementLongHand(this XElement rootElem)
{
rootElem.Value = " ";
rootElem.Value = string.Empty;
return rootElem;
}
如果您收到消息
扩展方法只能在非泛型、非嵌套的静态类中声明
,因为单词this
可能会突出显示,只需创建一个扩展类,如下所示:
public static class Extension
{
public static void WriteFullElementString(this XmlTextWriter writer, string localName, string value)
{
writer.WriteStartElement(localName);
writer.WriteRaw(value);
writer.WriteFullEndElement();
}
}
希望这证明是有用的:-)把这个留在这里,以防有人需要它;因为上面的答案没有一个能帮我解决这个问题,或者看起来有点过分了
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中
编辑:
或者,您也可以使用
w.Formatting = Formatting.Indented;
不要添加XmlWriterSettings。尝试以下操作:
x.WriteStartElement("my-tag");
//Value of your tag is null
If (<"my-tag"> == "")
{
x.WriteWhitespace("");
}else
x.WriteString(my-tag);
x.WriteEndElement();
x.writeStart元素(“我的标签”);
//标记的值为空
如果(=“”)
{
x、 写空白(“”);
}否则
x、 WriteString(我的标签);
x、 写删除();
我使用下一个代码:
if (string.IsNullOrEmpty(myStringValue))
{
myWriter.WriteStartElement("mytag");
myWriter.WriteFullEndElement();
}
else
{
myWriter.WriteElementString("mytag", myStringValue);
}
你可以在这里找到一个解决方案:它对我有效。我还没有尝试过,但我怀疑它会有效。唉,我使用的是遗留代码,我选择的是“最少更改”的方法……一个实用程序类或派生一个XmlWriter类来实现上述功能。这两种方法都可能需要大量的编辑,但两者都可能是“最少更改”的方法。事实上,在上面提到的“重复”问题中也提出了这种解决方案,以及将其作为扩展方法的想法。如果一切都失败了,我可以这样做,或者重写解析器,使其在元素级别工作。无论如何,感谢测试中的建议,如果我使用writer.WriteRaw(“”),然后使用writer.writeedelement(),我的标记不会自动关闭。VS 2010。