私はこのような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>
各ノードを繰り返して、次のことを実行しようとしています。
私が苦労しているのは、各ノードを反復処理し、各要素のnull値をチェックする方法です。
私はこのコードを 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();
}
}
}
そしてそれはテストすることもできます ここ
doc.Descendants().Where(e => string.IsNullOrEmpty(e.Value)).Remove();
この1行は、空の子タグでいっぱいの空の親タグを破棄しません。それはあなたの状況に適切かもしれないし、そうでないかもしれない彼らの子供たちを取り除くだけです。これを達成するための本当に簡単な変更は、最初に最低レベルから削除を開始するだけです。何かのようなもの
foreach(XElement child in doc.Descendants().Reverse())
{
if(!child.HasElements && string.IsNullOrEmpty(child.Value) && !child.HasAttributes) child.Remove();
}
属性の提案をしてくれたNyergudsに感謝します。
VBもう一度見つける必要がある場合に備えて:
doc.Descendants().Where(Function(e) String.IsNullOrEmpty(e.Value)).Remove()