我正在编写一个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);
}
答案 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);
}