Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 我们是否可以强制XmlWriter发布<;我的标签></我的标签>;而不是<;我的标签/>;?_.net_Xml_Xmlwriter - Fatal编程技术网

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