c# - 删除 XML 节点集合中的空/空白元素

标签 c# linq-to-xml xelement

我有一个这样的 XML 文档:

<magento_api>
    <data_item>
        <code>400</code>
        <message>Attribute weight is not applicable for product type Configurable Product</message>
    </data_item>
    <data_item>
        <code>400</code>
        <message>Resource data pre-validation error.</message>
    </data_item>
    <data_item>
        <code>1</code>
        <message></message>
    </data_item>
    <data_item>
        <code></code>
        <message>No code was given</message>
    </data_item>
</magento_api>

我正在尝试迭代每个节点并执行以下操作:

  1. 丢弃所有空的/空白的元素。
  2. 生成仅包含值的元素的新节点。
  3. 将生成的文档发送到不同的网络服务。

我遇到的问题是如何遍历每个节点并检查每个元素的空值。

我一直在 http://rextester.com/runcode 测试这段代码但似乎无法弄清楚:

Console.WriteLine("Querying tree loaded with XElement.Load");
Console.WriteLine("----");
XElement doc = XElement.Parse(@"<magento_api>
          <data_item>
            <code>400</code>
            <message>Attribute weight is not applicable for product type Configurable Product</message>
          </data_item>
          <data_item>
            <code>400</code>
            <message>Resource data pre-validation error.</message>
          </data_item>
          <data_item>
            <code>1</code>
            <message></message>
          </data_item>
          <data_item>
            <code></code>
            <message>No code was given</message>
          </data_item>
    </magento_api>");

int counter = 1;
IEnumerable<XNode> nodes =
    from nd in doc.Nodes()
    select nd;
foreach (XNode node in nodes)
{
    Console.WriteLine(counter + "-" + node);
    IEnumerable<XElement> elements =
    from el in node //this is where I've been trying various methods, but no dice.
    select el;
    foreach (XElement e in elements)
    {
           Console.WriteLine(counter + "-" + e.Name + "-" + e.Value + "\r\n");
    }
    counter++;
}

基于上面的 XML 输入,我希望得到以下输出:

<magento_api>
    <data_item>
        <code>400</code>
        <message>Attribute weight is not applicable for product type Configurable Product</message>
    </data_item>
    <data_item>
        <code>400</code>
        <message>Resource data pre-validation error.</message>
    </data_item>
    <data_item>
        <code>1</code>
    </data_item>
    <data_item>
        <message>No code was given</message>
    </data_item>
</magento_api>

我不确定我是否使用了正确的方法来遍历节点和元素。

最佳答案

一个单行代码就可以完成这项工作,无需遍历所有元素。开始了:

doc.Descendants().Where(e => string.IsNullOrEmpty(e.Value)).Remove();

测试员

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    public class TestRemove
    {
        public static void Main() {
            Console.WriteLine("----OLD TREE STARTS---");
            XElement doc = XElement.Parse(@"<magento_api>
                                              <data_item>
                                                <code>400</code>
                                                <message>Attribute weight is not applicable for product type Configurable Product</message>
                                              </data_item>
                                              <data_item>
                                                <code>400</code>
                                                <message>Resource data pre-validation error.</message>
                                              </data_item>
                                              <data_item>
                                                <code>1</code>
                                                <message></message>
                                              </data_item>
                                              <data_item>
                                                <code></code>
                                                <message>No code was given</message>
                                              </data_item>
                                        </magento_api>");
            Console.Write(doc.ToString());
            Console.WriteLine("");
            Console.WriteLine("----OLD TREE ENDS---");
            Console.WriteLine("");
            doc.Descendants().Where(e => string.IsNullOrEmpty(e.Value)).Remove();
            Console.WriteLine("----NEW TREE STARTS---");
            Console.Write(doc.ToString());
            Console.WriteLine("");
            Console.WriteLine("----NEW TREE ENDS---");
            Console.ReadKey();
        }
    }
}

而且还可以测试here

关于c# - 删除 XML 节点集合中的空/空白元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14509188/

相关文章:

c# - 如何为知识库系统构建搜索引擎?

c# - .net framework 内置的抽象类都有哪些?

c# - 显示项目在列表中的位置

c# - 如何在异步函数中发送参数值

c# - 如何将 XElement 写入已包含内容的 XmlWriter

c# - LINQ to XML C# 获取根元素属性

c# - 从 XML 文件加载时添加编号

c# - 区分 XElement 中的 null 和 string.Empty 值

c# - XElement 自动将 xmlns =""添加到自身

c# - XElement.Element ("Leve1/Level2") 而不是 XElement.Element ("Leve1").Element ("Level2")