Я хочу удалить родительские элементы из структуры XML, если дочерний элемент пуст. Мой XML:

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

Должно стать:

<Customers>
    <customer>
        <Name>John</Name>
        <Age>25</Age>
        <Status>single</Status>
    </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);

Как я могу удалить родительского «покупателя», если возраст и статус ребенка не указаны?

1
user2523188 3 Май 2014 в 23:27

2 ответа

Лучший ответ

Вы можете использовать синтаксис XPath вместе с методом SelectNodes(), чтобы легко получить определенные узлы из XmlDocument.

Пример выбора элементов <Customer>, имеющих дочерний узел <Age> и <Status> пустым, а затем удаление этих выбранных элементов:

var nodes = xmlDocument.DocumentElement.SelectNodes("//Customer[Age = '' and Status = '']");
foreach (XmlElement node in nodes)
{
    node.ParentNode.RemoveChild(node);
}

ОБНОВЛЕНИЕ:

Кажется, что именно вы конструируете XML. Поэтому я предлагаю проверить, пусты ли str3 и str4, и удалить ли они соответствующий элемент <Customer>:

if(string.IsNullOrEmpty(str3) && string.IsNullOrEmpty(str4))
{
    element1.ParentNode.RemoveChild(element1);
}
1
har07 4 Май 2014 в 14:58

Я понимаю, что вы создаете новый файл и добавляете каждый элемент после проверки. Я думаю, это должно сработать для вас:

XDocument input = XDocument.Load("customers.xml");
XDocument output = new XDocument();
output.Add(new XElement("Customers"));
IEnumerable<XElement> elements = input.Element("Customers").Elements("customer");
foreach (XElement el in elements)
{
    string age = el.Element("Age").Value;
    string status = el.Element("Status").Value;
    if (age != "" || status != "")
    {
        output.Element("Customers").Add(el);
    }
}
output.Save("customers.xml");
0
Jose Pardo 3 Май 2014 в 20:43