【问题标题】:Delete an xelement with no child element删除没有子元素的 xelement
【发布时间】:2020-06-27 13:15:07
【问题描述】:

我使用 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>

我想删除所有没有子元素的数据元素,即&lt;data /&gt; 元素。这是我的代码

 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);
            }
}

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

【问题讨论】:

标签: c# xml xml-parsing xmldocument xelement


【解决方案1】:

我会试着回答这个问题。

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

试一试,在foreach 语句之前使用它:

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

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

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

我还添加了一些文章和答案的链接,我认为这些链接可以帮助您解决问题。

【讨论】:

    【解决方案2】:

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

    (2) 我们将创建一个 SCHEME 节点的List&lt;XElement&gt; 列表。

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

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

    XML 文件

    <?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>
    

    c#

    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);
    }
    

    输出 XML

    <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>
            </scheme>
            <scheme>
                <data>
                    <serial-no>1</serial-no>
                    <employment>1</employment>
                    <code>1234</code>
                </data>
            </scheme>
            <scheme>
                <data>
                    <serial-no>1</serial-no>
                    <employment>1</employment>
                    <code>1234</code>
                </data>
            </scheme>
        </body>
    </return>
    

    【讨论】:

      猜你喜欢
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      相关资源
      最近更新 更多