在XML节点集合中删除空/空白元素 [英] Remove empty/blanks elements in collection of XML nodes

查看:816
本文介绍了在XML节点集合中删除空/空白元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样的XML文档:



<预类=郎咸平的XML prettyprint-覆盖> < magento_api>
< data_item>
<代码和GT; 400℃/代码>
<&消息GT;属性权重不适用产品类型配置的产品与LT; /消息>
< / data_item>
< data_item>
<代码和GT; 400℃/代码>
<&消息GT;资源数据的预验证错误< /消息>
< / data_item>
< data_item>
<代码> 1 LT; /代码>
<&消息GT;< /消息>
< / data_item>
< data_item>
<代码和GT;< /代码>
<&消息GT;没有代码被赋予< /消息>
< / data_item>
< / magento_api>



我想遍历每个节点并执行以下操作:




  1. 扔掉是空/空白的任何元素。

  2. 生成包含值仅元素的新节点。

  3. 发送所产生的文档到不同的Web服务。



我挣扎的部分是如何通过每个迭代节点,并检查空值的每个元素。



我已经在测试了这个代码 HTTP ://rextester.com/runco​​de ,但似乎无法推测出来:

  Console.WriteLine( 查询树装载XElement.Load); 
Console.WriteLine(----);
的XElement文档= XElement.Parse(@< magento_api>
< data_item>
<代码> 400℃/代码>
<消息>属性重量不适用产品类型配置的产品与LT; /消息>
< / data_item>
< data_item>
<代码> 400℃/代码>
<消息>资源数据预验证错误< /消息>
< / data_item>
< data_item>
<代码> 1< /代码>
<消息>< /消息>
< / data_item>
< data_item>
<代码>< /代码>
<消息>没有代码被赋予< /消息>
< / data_item>
< / magento_api>);

INT计数器= 1;
IEnumerable的< XNode>从次在doc.Nodes()
选择次节点=
;
的foreach(在节点XNode节点)
{
Console.WriteLine(计数器+ - +节点);
IEnumerable的<&的XElement GT;元素=
从EL在节点//这是我一直在尝试各种方法,但没有骰子。
选择El;
的foreach(的XElement E在元素)
{
Console.WriteLine(计数器+ - + e.Name + - + e.Value +\r\\\
);
}
计数器++;
}

根据上述XML输入,我希望能得到下面的输出

 < magento_api> 
< data_item>
<代码和GT; 400℃/代码>
<&消息GT;属性权重不适用产品类型配置的产品与LT; /消息>
< / data_item>
< data_item>
<代码和GT; 400℃/代码>
<&消息GT;资源数据的预验证错误< /消息>
< / data_item>
< data_item>
<代码> 1 LT; /代码>
< / data_item>
< data_item>
<&消息GT;没有代码被赋予< /消息>
< / data_item>
< / magento_api>



我不知道如果我用正确的方法来遍历节点和元素。


解决方案

一个单一的单行可以做的工作,没有需要遍历所有元素。这里有云:

  doc.Descendants(),其中(E => string.IsNullOrEmpty(e.Value))。去掉(); 



测试



 使用系统; 
使用System.Collections.Generic;
使用System.Linq的;
使用System.Text;
使用的System.Xml;
使用System.Xml.Linq的;

命名ConsoleApplication1
{
公共类TestRemove
{
公共静态无效的主要(){
Console.WriteLine(--- -old树开始的---);
的XElement文档= XElement.Parse(@< magento_api>
< data_item>
<代码> 400℃/代码>
<消息>属性重量不适用产品类型配置的产品与LT; /消息>
< / data_item>
< data_item>
<代码> 400℃/代码>
<消息>资源数据预验证错误< /消息>
< / data_item>
< data_item>
<代码> 1< /代码>
<消息>< /&消息GT;
< / data_item>
< data_item>
<代码和GT;< /代码>
<&消息GT;没有代码被赋予< /消息>
< / data_item>
将/ magento_api>中);
Console.Write(doc.ToString());
Console.WriteLine();
Console.WriteLine( - --old TREE完---);
Console.WriteLine();
doc.Descendants(),其中(E =方式> string.IsNullOrEmpty(e.Value)。)删除();
Console.WriteLine(----新树开始的---);
Console.Write(doc.ToString());
Console.WriteLine( );
Console.WriteLine(----新的树--- ENDS);
Console.ReadKey();
}
}
$} b $ b

并能同时进行测试的这里


I have an XML document like this:

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

I'm trying to iterate each node and do the following:

  1. Throw out any elements that are empty/blank.
  2. Generate new Node with only elements containing values.
  3. Send the resulting doc to different web service.

The part I'm struggling with is how to iterate through each node and check each element for null values.

I've been testing this code out at http://rextester.com/runcode but can't seem to figure it out:

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

Based on the above XML input, I'm hoping to get the following output:

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

I'm not sure if I'm using the right methods to iterate over the nodes and elements.

解决方案

A single one-liner could do the job, no need to iterate over all elements. Here it goes:

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

Tester

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

And it also could be tested here

这篇关于在XML节点集合中删除空/空白元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆