删除没有子元素的元素

时间:2020-03-16 12:09:15

标签: c# xml xml-parsing xmldocument xelement

使用XElement的XML的结构如下所示。我在XDocument中使用XElement

<?xml version='1.0' encoding='UTF-8'?>
<return xmlns:rmas="" xmlns:xsi="" xsi:noNamespaceSchemaLocation="">
  <header>
    [...]
  </header>
  <body>
     <scheme>
        [...]
        <data>
          <serial-no>1</serial-no>
          <employment>1</employment>
          <code>1234</code>
        </data>
        <data />
        <data />
     </scheme>
     <scheme>
        [...]
        <data>
          <serial-no>1</serial-no>
          <employment>1</employment>
          <code>1234</code>
        </data>
        <data />
        <data />
     </scheme>
     <scheme>
        [...]
        <data>
          <serial-no>1</serial-no>
          <employment>1</employment>
          <code>1234</code>
        </data>
        <data />
        <data />
     </scheme>
  </body>
</return>

我想删除没有子元素(即<data />元素)的所有数据元素。这是我的代码

 foreach (XElement scheme in doc.Descendants("scheme"))
 {
            //copy an existing node as template for new data node.
            XElement newData = XElement.Parse(scheme.Element("data").ToString());
            newData.Element("serial-no").SetValue("abc1234");
            newData.Element("employment").SetValue("PUZAD-452");
            newData.Element("code").SetValue(codeValue);


            XElement newData2 = XElement.Parse(scheme.Element("data").ToString());
            newData2.Element("serial-no").SetValue("abc1234");
            newData2.Element("employment").SetValue("PUZAD-452");
            newData2.Element("code").SetValue(codeValue);


            XElement newData3 = XElement.Parse(scheme.Element("data").ToString());
            newData3.Element("serial-no").SetValue("abc1234");
            newData3.Element("employment").SetValue("PUZAD-452");
            newData3.Element("code").SetValue(codeValue);

            if (getGlobalScheme1 == "1111")
            {
                if ((string)(scheme.Descendants("code").First()) == "1111")
                {
                    newData2.RemoveAll();
                    newData3.RemoveAll();
                }
                scheme.Add(newData);
            }
            if (getGlobalScheme2 == "2222")
            {
                if ((string)(scheme.Descendants("code").First()) == "2222")
                {
                    newData.RemoveAll();
                    newData3.RemoveAll();
                }
                scheme.Add(newData2);
            }

            if (getGlobalScheme3 == "3333")
            {
                if ((string)(scheme.Descendants("code").Last()) == "3333")
                {
                    newData.RemoveAll();
                    newData2.RemoveAll();
                }
                scheme.Add(newData3);
            }
}

如何实现我的目标,即删除没有子元素的<data />元素。我一直在努力解决这个问题,但无济于事。

2 个答案:

答案 0 :(得分:0)

我会尽力回答。

尝试将具有子元素的元素添加到数组中,然后对其进行迭代。

给出以下建议,在foreach语句之前使用它:

    var nodes = doc.Descendants("scheme").Where(x => x.Element("data") != null).ToList();

除此之外,您可以尝试使用完全相反的逻辑,方法是检查当前正在迭代的节点是否具有此代码段的子代:

    YourXmlNode.ChildNodes.OfType<XmlElement>().Any()

我还添加了一些文章和答案的链接,我认为这些链接将帮助您找出问题所在。

答案 1 :(得分:0)

(1)让您将XML保存为文件系统上的文件。

(2)我们将创建一个 SCHEME 节点的wmic Path win32_process Where "CommandLine Like '%%\\explorer.exe %% -Embedding'" Call Terminate 列表。

(3)遍历 SCHEME 节点列表,并删除没有子元素的 DATA 元素。

(4)将修改后的XML保存回文件。

XML文件

List<XElement>

c#

<?xml version="1.0" encoding="UTF-8"?>
<return xmlns:rmas="someURI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="fafa.xsd">
    <header>[...]</header>
    <body>
        <scheme>
            <data>
                <serial-no>1</serial-no>
                <employment>1</employment>
                <code>1234</code>
            </data>
            <data/>
            <data/>
        </scheme>
        <scheme>
            <data>
                <serial-no>1</serial-no>
                <employment>1</employment>
                <code>1234</code>
            </data>
            <data/>
            <data/>
        </scheme>
        <scheme>
            <data>
                <serial-no>1</serial-no>
                <employment>1</employment>
                <code>1234</code>
            </data>
            <data/>
            <data/>
        </scheme>
    </body>
</return>

输出XML

void Main()
{
    const string fileName = @"e:\Temp\Delete.xml";
    const string SCHEME = "scheme";
    const string DATA = "data";

    XDocument xdoc = XDocument.Load(fileName);

    // create list of SCHEME nodes
    List<XElement> nodes = xdoc.Descendants(SCHEME).ToList();

    // iterate through list of SCHEME nodes and delete DATA elements without children.
    foreach (XElement node in nodes)
        node.Elements(DATA).Where(n => n.DescendantNodes().Count() == 0).Remove();

    // end result
    Console.WriteLine(xdoc);

    // save back
//  xdoc.Save(fileName);
}