2016-04-25 7 views
0

XMLファイルがあります。このファイルには、いくつかのノードとその子が同じ名前と属性を持つことがあります。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="Buying"> 
     <Name>Ellen Adams</Name> 
    </Address> 
    <Address Type="transporting"> 
     <Name>Tai Yee</Name> 
     <Street>8 Oak Avenue</Street> 
    </Address> 
    </Address> 
    <DeliveryNotes>Please leave packages in shed by driveway.</DeliveryNotes> 
    <Items> 
    <Item PartNumber="872-AA"> 
     <ProductName>Lawnmower</ProductName> 
     <Quantity>1</Quantity> 
     <USPrice>148.95</USPrice> 
     <Comment>Confirm this is electric</Comment> 
    </Item> 
    <Item PartNumber="926-AA"> 
     <ProductName>Baby Monitor</ProductName> 
     <Quantity>2</Quantity> 
     <USPrice>39.98</USPrice> 
     <ShipDate>1999-05-21</ShipDate> 
    </Item> 
    </Items> 
</PurchaseOrder> 

Addressのノードだけを属性として出力したいと考えています。問題は、Addressノードを子として持ついくつかの入れ子ノードがあることです。子供へのアクセスを取得するAddress私の問題です。再び、それは名前Addressの子供を持っている場合、私は私にこのノードを与えたくない、私は次のコード

public void find_node(string ID_node) 
{ 
    XElement root = XElement.Load("PurchaseOrder.xml"); 
    IEnumerable<XElement> address = 
     from el in root.Elements("Address") 
     where (string)el.Attribute("Type") == "Buying" 
     select el; 

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

に行ったように、このコードのための所望の出力は

<Address Type="Buying"> 
    <Name>Ellen Adams</Name> 
</Address> 

だろうけど私は上記の関数を実行しているときに空の出力を持っています。

私はこの機能のために空の出力を乗せてもらえますか?

+0

あなたは何であるか私たちを見ることができます希望の出力? –

+0

@HariPrasad Q. –

答えて

1

あなたがいる限り、それは属性フィルタに一致するよう、あなたの代わりにDescendants("Address")を使用することができ、XML内にかかわらず、その場所のAddress要素を探すことを意味している場合:

IEnumerable<XElement> address = 
       from el in root.Descendants("Address") 
       where (string)el.Attribute("Type") == "Buying" 
       select el; 
+0

答えをありがとう。よく働く。 –

0
IEnumerable<XElement> address = 
      from el1 in root.Elements("Address") 
      from el2 in el1.Elements("Address") 
      where (string)el2.Attribute("Type") == "Buying" 
      select el2; 
+0

の更新版をご覧ください。一般に、このメソッドは、内部の子がより深いノードである場合には失敗します。しかし、この例では正常に動作します。 –