2016-04-22 10 views
0

私は次のファイルXMLを持っており、特定の属性を持つ要素を探したいと思っています。私が見つけたのは"Type" == "Billing"の属性を探しています。xmlの属性を使用して特定のノードを見つけることに問題がある

<?xml version="1.0"?> 
<PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20"> 
    <Address Type="Shipping"> 
    <Name>Ellen Adams</Name> 
    <Street>123 Maple Street</Street> 
    <City>Mill Valley</City> 
    <State>CA</State> 
    <Zip>10999</Zip> 
    <Country>USA</Country> 
    </Address> 
    <Address Type="Billing"> 
    <Name>Tai Yee</Name> 
    <Street>8 Oak Avenue</Street> 
    <City>Old Town</City> 
    <State>PA</State> 
    <Zip>95819</Zip> 
    <Country>USA</Country> 
    <Address Type="Shipping"> 
     <Name>Ellen Adams</Name> 
    </Address> 
    <Address Type="transporting"> 
     <Name>Tai Yee</Name> 
     <Street>8 Oak Avenue</Street> 
    </Address> 
    </Address> 
</PurchaseOrder> 

問題は、ここでは第二Addressノードは、私が実際に持っている弱々しいものに関連していないだろう他のいくつかの内部のノードを持っていることです。私はShippingtransportingの属性を出力してはいけません。私が考えているのは、次の出力しかないので、どのようなコードが必要なのでしょうか?

<Address Type="Billing"> 
    <Name>Tai Yee</Name> 
    <Street>8 Oak Avenue</Street> 
    <City>Old Town</City> 
    <State>PA</State> 
    <Zip>95819</Zip> 
    <Country>USA</Country> 
</Address> 

と私が持っているコードは:開始タグと終了タグの間に

XElement root = XElement.Load("PurchaseOrder.xml"); 
IEnumerable<XElement> address = 
    from el in root.Elements("Address") 
    where (string)el.Attribute("Type") == "Billing" 
    select el; 
foreach (XElement el in address) 
    Console.WriteLine(el); 

答えて

1

すべてが要素の一部です。

foreach (XElement el in address) 
{ 
    var newElement = new XElement(
          el.Name.LocalName, 
          el.Attributes(), 
          el.Elements().Where(o => o.Name.LocalName != "Address") 
        ); 
    Console.WriteLine(newElement.ToString()); 
} 

または2.削除Address要素すなわち、すべての不要な情報:ここでは

foreach (XElement el in address) 
{ 
    el.Elements("Address").Remove(); 
    Console.WriteLine(el.ToString()); 
} 
+0

お返事ありがとうございます。それは良いアイデアです。 「必要な情報のみを含めるように要素を再構成する」ことを説明してもらえますか? 私はそれも素晴らしい考えだと思います。 –

+0

@SaberJalilzadehは、他のアプローチの例を更新しました。希望があれば – har07

+0

本当に感謝しています。それは素晴らしい考えを与える –

0

がどのように所望の出力を取得するには、1だけ必要な情報が含まれるように要素を再構築するか必要があります私はそれをするでしょう

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

namespace ConsoleApplication87 
{ 
    namespace Linq 
    { 
     class Program 
     { 
      const string FILENAME = @"c:\temp\test.xml"; 
      static void Main(string[] args) 
      { 
       List<string> acceptableElements = new List<string>(){"Name", "Street", "City", "State", "Zip", "Country"}; 

       XDocument doc = XDocument.Load(FILENAME); 
       List<XElement> addresses = doc.Descendants("Address").ToList(); 
       XElement billing = addresses.Where(x => x.Attribute("Type").Value == "Billing").FirstOrDefault(); 
       addresses.Remove(); 
       XElement po = (XElement)doc.FirstNode; 
       po.Add(billing); 
      } 
     } 
    } 


} 
関連する問題