Как анализировать XML-файл для эффективного получения конкретных данных - PullRequest
1 голос
/ 09 марта 2010

У меня XML-файл выглядит так:

<?xml version="1.0" encoding="utf-8" ?> 
 <PathMasks>
 <Mask desc="Masks_X1">
  <config id="01" mask="88" /> 
  <config id="03" mask="80" /> 
  <config id="51" mask="85" /> 
  </Mask>

 <Mask desc="Masks_X2">
  <config id="70" mask="1" /> 
  <config id="73" mask="6" /> 
  </Mask>

 <Types>
  <path id="01" desc="TC->PP1" /> 
  <path id="02" desc="TC->PP2" /> 
  <path id="03" desc="TC->PPn" /> 
  </Types>
  </PathMasks>

Как проанализировать файл и получить все данные Mask_X1 следующим образом:

id  value
=====
01, 88
03, 80
51, 85

.NET Framework, который я использую, - 2.0

.

Ответы [ 4 ]

2 голосов
/ 09 марта 2010

Поскольку вы работаете с .Net 2.0, у вас не будет Linq, и поэтому вам нужно будет использовать XPath, этот пример должен вам помочь.

        XmlDocument doc = new XmlDocument();

        doc.Load(pathToXmlDoc);


        XmlNode node = doc.SelectSingleNode("/PathMasks/Mask[@desc='Masks_X1']");

        foreach (XmlNode config in node)
        {
            Console.WriteLine("{0}\t{1}", 
                            config.Attributes["id"].Value,
                            config.Attributes["mask"].Value);
        }
1 голос
/ 09 марта 2010

Использование XmlDocument (медленный, больший объем памяти, чтение / запись, работает так же, как везде работают XML DOM):

XmlDocument d = new XmlDocument();
d.Load(filename);
string xpath = "/PathMasks/Mask[@desc='Mask_X1']/config"
foreach (XmlElement elm in d.SelectNodes(xpath))
{
   Console.WriteLine(elm.GetAttribute("id"), elm.GetAttribute("desc"));
}

Использование XPathDocument (быстрее, меньший объем памяти, чтение и записьтолько странный API):

XPathDocument d = new XPathDocument(filename);
string xpath = "/PathMasks/Mask[@desc='Mask_X1']/config"
XPathNodeIterator iter = d.CreateNavigator().Select(xpath);
while (iter.MoveNext())
{
   Console.WriteLine(iter.Current.GetAttribute("id"), iter.Current.GetAttribute("desc'));
}

Я уверен, что есть вполне веская причина, почему нет метода XPathNavigator, который возвращает IEnumerable<XPathNavigator>, чтобы вы могли перебирать результатызапрос XPath, как обычный человек, но я не смог его обработать.

0 голосов
/ 09 марта 2010

Использование Linq to XML:

XDocument doc = XDocument.Load(filename);
var query = from mask in doc.Root.Elements("Mask")
            where mask.Attribute("desc").Value == "Masks_X1"
            from config in mask.Elements("config")
            select new
            {
                id = config.Attribute("id").Value,
                value = config.Attribute("mask").Value
            };

foreach(var mask in query)
{
    Console.WriteLine("{0}\t{1}", mask.id, mask.value);
}
0 голосов
/ 09 марта 2010

Используйте XDocument и запрашивайте его с помощью Linq to XML

XDocument doc = XDocument.Load("file.xml");
var linqtoxml = from node in document.Descendants("Mask")
    where (string)node.Attribute("desc").Value == "Masks_X1"
    select node;
foreach (var mask in linqtoxml)
{
    // pull data out of here into a structure of your choosing
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...