2017-10-30 15 views
1

私は作業しているXMLからCSVファイルを作成しようとしています。次のようにXMLが構成されていますXDocumentとLINQでXMLを読む子孫の混乱

<dt_type> 
    <t_name>Commodities</t_name> 
    <dt_category> 
     <pc_name>ironore_steel</pc_name> 
     <dt_products> 
      <p_name>iron</p_name> 
     </dt_products> 
     <dt_products> 
      <p_name>coiled steel</p_name> 
     </dt_products> 
    </dt_category> 
    <dt_category> 
     <pc_name>rubber</pc_name> 
     <dt_products> 
      <p_name>molten rubber</p_name> 
     </dt_products> 
     <dt_products> 
      <p_name>pressed rubber</p_name> 
     </dt_products> 
    </dt_category> 
</dt_type> 

私は(t_name、pc_name、P_NAME)のようなCSVファイルを構築したい

を私が持っている現在のコードは、この

XDocument xdoc = XDocument.Load(output + "xmlSgx.txt"); 
//query xml 
var xdata = from r in xdoc.Descendants("dt_category") 
      select new 
      { 
       //tName = r.Element("t_name").Value, 
       pcName = (string)r.Element("pc_name"), 
       pName = (string)r.Element("dt_products").Element("p_name") 
      }; 

foreach (var r in xdata) 
{ 
    result.AppendLine(r.pcName + "," + r.pName); 
} 
using (StreamWriter file = new StreamWriter(output + "xmlRes.txt")) 
{ 
    file.Write(result); 
} 

最高出力であります私はこれを生産することができました:

ironore_steel,iron 
rubber,molten rubber 

私は私が降りているときに複数を引っ張ることさえできませんROM

私が引っ張って欲しいものの例:

Commodities,ironore_steel,iron 
Commodities,ironore_steel,coiled steel 
Commodities,rubber,molten rubber 
Commodities,rubber,pressed rubber 

右方向への任意のナッジを大幅に理解されるであろう!

+0

p_nameごとにt_nameとpc_nameを繰り返しますか?指定されたxmlのサンプルcsv出力を投稿する – Riv

+0

オリジナルの投稿を編集して、私が構築しようとしているものの例を含めました! – mPatrick

答えて

1

各カテゴリから1つのノードのみを選択しています。 この方法では、ラインとして、各カテゴリを返し、あなたは必要な出力を見た後に更新File.WriteAllLines

private static IEnumerable<string> GetLines() 
    { 
     XDocument doc = XDocument.Parse(data); 
     var title = doc.Descendants("t_name").First().Value; 
     var xdata = from r in doc.Descendants("dt_category") 
     select title + "," + (string)r.Element("pc_name") + "," + string.Join(",", r.Descendants("p_name").Select(e => e.Value.ToString()).ToArray()); 
     return xdata; 
    } 

使用して、テキストファイルにそれをプッシュすることができます:これは例外を持っていない

private static IEnumerable<string> GetLines2() 
{ 
    XDocument doc = XDocument.Parse(data); 
    var title = doc.Descendants("t_name").First().Value; 
    var names = doc.Descendants("p_name"); 
    var lines = from n in names select title + "," + n.Parent.Parent.Descendants("pc_name").First().Name + "," + n.Value; 
    return lines; 
} 

取り扱い。

+0

このソリューションを使用しようとしましたが、私が得たものは以下の通りです: 商品、ironore_steel、鉄、コイル鋼 商品、ゴム、溶融ゴム、圧縮ゴム – mPatrick

+0

私はあなたの元の例から、 – Kell