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

27

默认情况下,

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

生成 <my-tag />

我查看了XmlWriterSettings类的可能选项,以强制编写器生成<my-tag></my-tag>,但未发现任何内容。

是否有一种简单的方法可以强制XmlWriter使用“开始标记、结束标记”而不是短格式形式来发出空元素?

编辑:
是的! 我意识到对于XML有效性而言,这两个符号是等效的,都是有效的... 然而,我正在使用解析该类XML的遗留代码,该代码使用Read()在节点级别(!),并通过在空节点上Read()-时搞砸事情...

因此,我的问题是在限制对这个遗留代码进行更改的情况下提出的。正如建议的此SO问题所述,该问题确实与之重叠。然而,那里提供的选项都不容易适用于我的情况。


你可以在这里找到解决方案:https://dev59.com/C2Yr5IYBdhLWcg3wytLe这对我有用。 - Portekoi
7个回答

20

这对我有效:

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

WriteEndElement仍会自闭标签。


2
在我的测试中,如果我执行writer.WriteRaw(""),然后执行writer.WriteEndElement(),我的标签将不会自闭。VS 2010。 - CD Jorgensen

3
如果您收到消息“扩展方法只能在非泛型、非嵌套的静态类中声明”,并且单词“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
我使用下面的代码:

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

2

试试这个:

x.WriteStartElement("my-tag"); 

//Value of your tag is null

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

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

x.WriteEndElement();

1

你尝试过这样吗:

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

也许可以创建一个实用类,并将其作为成员函数。

我没有尝试过,但我怀疑它会起作用。唉,我正在处理遗留代码,并采取“最少更改”方法... - mjv
一个实用类或派生一个XmlWriter类来完成以上任务。两个都可能需要大量编辑,但任一种方法也可能是“最少更改”的方法。 - DwB
事实上,上面提到的“重复”问题也建议使用这个解决方法,并且提出将其作为扩展方法的想法。如果所有尝试都失败了,我可能会这样做,或者重写解析器以使其在元素级别工作。无论如何,感谢您的建议。 - mjv

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 中。

编辑:

或者你也可以使用

w.Formatting = Formatting.Indented;

代替添加一个XmlWriterSettings。

0

我刚遇到了完全相同的问题,虽然这似乎有点像黑客,但确实有效,并且对我需要处理的现有代码没有太多干扰。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接