2013-10-16 30 views
1

所以我有一个看起来像这样的XML文件。加载XML文件的内容

<recept id="1" sort="vardag"> 
    <!-- namn och portioner förekommer endast en gång i varje respektive element--> 
    <namn>Pannkaka</namn> 
    <portioner>4 portioner</portioner> 
    <!--elementet ingrediens inehåller PCDATA och ett underelement dvs mangd 
    och kan förekomma minst 1 eller flera gånger--> 

     <ingrediens> 
     Ägg<mangd> 3 st</mangd> 
     </ingrediens> 
     <ingrediens> 
     Mjölk<mangd> 10 dl</mangd> 
     </ingrediens> 
     <ingrediens> 
     Mjöl<mangd> 3 dl</mangd> 
     </ingrediens> 
     <ingrediens> 
     Salt<mangd> En nypa</mangd> 
     </ingrediens> 
     <ingrediens> 
     Matfett<mangd> 2 msk matolja eller smör</mangd> 
     </ingrediens> 

    <!--elementet tillredning kan endast förekomma en gång i elementet recept och 
    innehåller PCDATA--> 
    <tillredning> 
     <steg>Ta fram en lagom stor bunke</steg> 
     <steg>Smält smöret i en kastrull</steg> 
     <steg>Vispa ihop ägg, mjölk, mjöl och saltet</steg> 
     <steg>Låt smöret svalna en smula och blanda sen det i smeten</steg> 
     <steg>Stek gyllenbruna i stekpanna på medelvärme</steg> 
    </tillredning> 
    </recept> 

现在,当我在ID上搜索我想要加载之间的一切。 我目前刚刚通过+添加了它们,但是如果一个子类别多于一个,它只会加载其中的一个。

private void buttonSök_Click(object sender, EventArgs e) 
    { 
     var v = (from x in el.Descendants("recept") 
       where x.Attribute("id").Value.ToLower() == textBoxID.Text.ToLower() 
       select x).FirstOrDefault(); 

     if (v == null) 
     { 
      MessageBox.Show("Finns inte!"); 
     } 
     richTextBox1.Text = v.Element("namn").Value + "\r\n" + v.Element("portioner").Value + "\r\n" + v.Element("ingredienser").Value +"\r\n" + v.Element("tillredning").Value; 

    } 

回答

0

考虑使用类似下面的方法提取的成分:

private static string ExtractIngredients(XElement v) 
{ 
    var ingredients = v 
     .Elements("ingrediens") 
     .Select(e => 
      e.DescendantNodes().OfType<XText>().First().Value + 
      ": " + 
      e.Element("mangd").Value); 

    return String.Join("\r\n", ingredients); 
} 

在这里,您使用的事实,成分名称是XML文本节点,并指其为独立的儿童“ingrediens”节点。