如果InnerText为null,则将XML元素写为<element>而不是<element> </element>

时间:2015-06-18 09:04:30

标签: c# xml

我正在编写一个c#类来编写一个XML文件,该文件需要与我们使用的现有XML的结构完全匹配,以便一些遗留系统不会混淆。

当元素的InnerText值为null时,我需要xml元素的元素标记就像

<element/>

而不是

<element></element>

我设法事先做到了,但无法重复。 以下是我用来编写xml文件的方法示例:

public bool WriteXML(string path)
    {
        // Create the xml document in memory inc. xml declaration
        XmlDocument doc = new XmlDocument();
        XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "UTF-8", null);

        // Create the root element
        doc.AppendChild(dec);
        XmlElement rootNode = doc.CreateElement("root");
        doc.AppendChild(rootNode);

        // Create elements at root node
        XmlElement XE_level1 = doc.CreateElement("level1");
        XE_level1.InnerText = "Text";
        rootNode.AppendChild(XE_level1);

        // Create a user data element
        XmlElement XE_level2 = doc.CreateElement("level2");
        XE_level2.InnerText = "Text";
        XE_level1.AppendChild(XE_level2);

        doc.Save(path);
    }

4 个答案:

答案 0 :(得分:3)

XmlElement似乎在每次调用InnerText的set属性访问器时展开。此代码段适用于新XmlElement s:

if(text != null) {
    myNode.InnerText = text;
}

答案 1 :(得分:3)

正如@Binkan Salaryman所说,没有必要明确设置IsEmpty,它是true by default。当你不需要时,不要设置InnerText。如果您在许多地方需要此行为,则可以编写简单的扩展方法:

public static class XmlUtils
{
    public static void SetInnerText(this XmlElement xmlElement, string text)
    {
        if(text != null)
            xmlElement.InnerText = text;
    }
}

并像这样使用它:

// text can be null here, element will still looks like <level2 />
XE_level2.SetInnerText(text); 

答案 2 :(得分:1)

你想要的似乎是XmlElement.IsEmpty(https://msdn.microsoft.com/en-us/library/system.xml.xmlelement.isempty(v=vs.110).aspx

文档说:

  

如果要以短标记格式“<item/>”序列化元素,则返回true; false为长格式“<item></item>”。

     

设置此属性时,如果设置为true,则删除元素的子元素,并以短标记格式序列化元素。

答案 3 :(得分:0)

如果Element没有值,请将IsEmpty属性设置为true,这样可以为您提供所需的输出。

   public static void WriteXML(string path)
    {
        // Create the xml document in memory inc. xml declaration
        XmlDocument doc = new XmlDocument();
        XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "UTF-8", null);

        // Create the root element
        doc.AppendChild(dec);
        XmlElement rootNode = doc.CreateElement("root");
        doc.AppendChild(rootNode);

        // Create elements at root node
        XmlElement XE_level1 = doc.CreateElement("level1");
        XE_level1.InnerText = "Text";
        rootNode.AppendChild(XE_level1);

        // Create a user data element

        string s = String.Empty;

        if (String.IsNullOrEmpty(s))
        {
            XmlElement XE_level2 = doc.CreateElement("level2");
            XE_level2.IsEmpty = true;
            XE_level1.AppendChild(XE_level2);
        }
        else
        {
            XmlElement XE_level2 = doc.CreateElement("level2");
            XE_level2.InnerText = s;
            XE_level1.AppendChild(XE_level2);
        }



        doc.Save(path);


    }