2012-09-21 4 views
3

Я новичок в LINQ/XML. Я только что узнал, что языковые интегрированные запросы могут использоваться для синтаксического анализа xml. Я пытаюсь проанализировать следующую структуру XML и мне нужна помощьParsing XElement

=================================================== =

<config> 

<params> 
    <tp name="abc">yes</tp> 
    <tp name="aee">no</tp> 
    <tp name="bbc">no</tp> 
    <tp name="ccb">yes</tp> 
</params> 

<nits> 
    <tn name="kjh"> 
    <min>44</min> 
    <max>98</max> 
    </tn> 

    <tn name="klm"> 
    <min>55</min> 
    <max>88</max> 
    </tn> 

    <tn name="hhh"> 
    <min>44</min> 
    <max>98</max> 
    </tn> 
</nits> 

<params> 
    <tp name="lml">no</tp> 
    <tp name="rre">yes</tp> 
    <tp name="rst">no</tp> 
    <tp name="wee">yes</tp> 
</params> 

<nits> 
    <tn name="adf"> 
    <min>44</min> 
    <max>98</max> 
    </tn> 

    <tn name="ddd"> 
    <min>42</min> 
    <max>92</max> 
    </tn> 

    <tn name="kjj"> 
    <min>92</min> 
    <max>98</max> 
    </tn> 
</nits> 

</config> 

==================================

Выход необходимо:

Моя цель состоит в том, чтобы показать вышеуказанные данные в виде пар ключ-значение по категориям в виде текстового файла или таблицы данных и т.д.

<Params> 
abc : yes 
aee : no 
bbc : yes 
... 
... 
... 
... 


<nits> 

kjh: 44 , 98 
klm: 55 , 88 
... 
... 
kjj: 92 , 98 
ddd: 42 , 92 
... 
01 Необходимо также

Код я написал до сих пор есть,

static void QueryTheData(XDocument doc) 
     { 
      try 
      { 
       var a = doc.Descendants("config").Elements("params"); 
       var b = doc.Descendants("config").Elements("nits"); 

       var c = doc.Elements("tp"); 
       var d = doc.Elements("tn"); 

       /* to do : parse the elements into key value pairs */ 
       /* Need hint or help to proceed to get key value pairs from xml data 

      } 
      catch(Exception e) 
      { 
       .... 
      }    
} 

ЛЮБОГО хорошие указатели для начинающих LINQ/XML C#.

спасибо заранее, ак

+0

Кажется великолепной работы для XSLT – sehe

ответ

1

"также необходимы какие-то хорошие указатели для начинающих LINQ/XML C#".

Возможно, вы найдете .NET Language-Integrated Query for XML Data, который рассказывает об использовании LINQ to XML.

+0

Абсолютно нет - 'XmlReader' бы сделать это * много * сложнее, чем с помощью LINQ к XML. –

+0

@JonSkeet. Именно поэтому ответ включает LINQ to XML, а также XmlReader. – Chimera

+0

...и теперь вы представили пример, который, несомненно, касается фрагмента XML, который не имеет ничего общего с образцом OP и не использует 'XmlReader' и' StringBuilder', о которых вы говорили в начале ... –

1

Значит, вы хотите получить атрибут name и текстовое значение от каждого элемента <tp>? Это просто:

// Parameters 
var query = doc.Descendants("tp") 
       .Select(tp => new { Name = tp.Attribute("name").Value, 
            Value = tp.Value }); 

foreach (var result in query) 
{ 
    Console.WriteLine("{0} : {1}", result.Name, result.Value); 
} 

И аналогична для мин/макс части:

var query = doc.Descendants("tn") 
       .Select(tn => new { Name = tn.Attribute("name").Value, 
            Min = (int) tn.Element("min"), 
            Max = (int) tn.Element("max") }); 

foreach (var result in query) 
{ 
    Console.WriteLine("{0}: {1}, {2}", result.Name, result.Min, result.Max); 
} 

Это предполагает, что XML следует схеме вы выложили, конечно, - это потерпит неудачу, если элементы дона у вас есть правильные дети или атрибуты.

+0

О, сладкий. Я не знал об операторах преобразования в XElement] (http://msdn.microsoft.com/en-us/library/bb340386 (v = vs.95) .aspx) s :) +1 – sehe

0

Ответ Джона Скита сделает трюк для выбора части params вашего выхода.

Любые хорошие указатели для LINQ/XML C# для начинающих также необходимы.

Я рекомендую C# in Depth, Second Edition, от Jon Skeet. В целом это отличная книга C#, и она включает в себя некоторые материалы LINQ to XML. Пока вы ждёте, что книга прибудет, и как дополнение LINQ to XML к книге, я бы рекомендовал Microsoft's LINQ to XML documentation.

+0

Также, http: //code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b. – JamieSee

2

Я пришел с этим:

using System.Linq; 
using System.Xml.Linq; 
using System.Xml.XPath; 
using System.IO; 
using System; 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     using (var fs = new StreamReader("./test.xml")) 
     { 
      var doc = XDocument.Load(fs); 

      var parms = doc.Root.XPathSelectElements("params/tp") 
       .ToDictionary(el => el.Attribute("name").Value, el => el.Value); 

      var nits = doc.Root.XPathSelectElements("nits/tn") 
       .Select(el => new { 
         Name = el.Attribute("name").Value, 
         Min = (int) el.Element("min"), 
         Max = (int) el.Element("max") 
        }).ToList(); 

      foreach (var kvp in parms) 
       Console.WriteLine("{0}: {1}", kvp.Key, kvp.Value); 

      foreach (var nit in nits 
        .OrderBy(nit => nit.Name) 
        .ThenBy(nit => nit.Max)) 
      { 
       Console.WriteLine("{0}: {1} {2}", nit.Name, nit.Min, nit.Max); 
      } 
     } 
    } 
} 

Это показывает некоторые из ингредиентов, включая различные подходы к хранению Params/гнид типов сбора. Выход:

abc: yes 
aee: no 
bbc: no 
ccb: yes 
lml: no 
rre: yes 
rst: no 
wee: yes 
adf: 44 98 
ddd: 42 92 
hhh: 44 98 
kjh: 44 98 
kjj: 92 98 
klm: 55 88 
+0

Результат, похоже, именно то, что назначил врач сейчас – sehe

Смежные вопросы