节点为空时RemoveChild

时间:2014-04-29 17:07:40

标签: c# xml removechild

如果节点为空,我想使用RemoveChild()从XML结构中删除一些子元素。我的XML:

<Customers>
<customer>
    <Name>John</Name>
    <Age>25</Age>
    <Status></Status>
</Customer>
<customer>
    <Name>John</Name>
    <Age></Age>
    <Status></Status>
</Customer>
</Customers>

应该成为:

<Customers>
<customer>
    <Name>John</Name>
    <Age>25</Age>
</Customer>
<customer>
    <Name>John</Name>
</Customer>
</Customers>

到目前为止我的代码:

XmlElement element3 = xmlDocument.CreateElement("Age");
        element3.InnerText = str3;
        element1.AppendChild((XmlNode)element3);    
XmlElement element4 = xmlDocument.CreateElement("Status");
        element4.InnerText = str4;
        element1.AppendChild((XmlNode)element4);

如何删除空节点resp。节点是否有多个空节点?

3 个答案:

答案 0 :(得分:2)

添加条件以仅在需要时创建元素:

if (!string.IsNullOrEmpty(status))
{
    XmlElement statusElement = xmlDocument.CreateElement("Status");
    statusElement.InnerText = status;
    customerElement.AppendChild((XmlNode)statusElement);
}

或者,如果您需要在创建它之后将其删除(例如,因为您从外部源Status获取XML),请使用相同的条件将其删除:

if (!string.IsNullOrEmpty(status))
{
    customerElement.RemoveChild(statusElement);
}

答案 1 :(得分:0)

这是因为你试图删除一个根本不存在的子元素。您必须了解,在此上下文中,RemoveChild()方法需要引用父项子项中的现有节点。

如果我要使用上面的代码示例并创建一个独立的代表,它将如下所示:

XmlDocument doc = new XmlDocument();
        XmlElement element1 = doc.CreateElement("Customer");
        XmlElement element2 = doc.CreateElement("Name");
        element2.InnerText = "John";
        element1.AppendChild(element2);
        XmlElement element3 = doc.CreateElement("Age");
        element3.InnerText = "25";
        element1.AppendChild(element3);
        XmlElement element4 = doc.CreateElement("Status");
        element4.InnerText="";
        element1.AppendChild(element4);
        doc.AppendChild(element1);
        element1.RemoveChild(element1.SelectSingleNode("Status"));

答案 2 :(得分:0)

使用Linq-to-XML:

如果你想要节点:

<a>
   <b>
       <c></c>
   </b>
</a>

成为:

<a />

使用:

XElement root = XElement.Load(file);
root.Descendants().Reverse().ToList().ForEach(x =>
    {
        if (x.IsEmpty)
            x.Remove();
    });

但如果你想要它:

<a>
    <b />
</a>

删除.Reverse()