C # Как извлечь полный набор узлов XML - PullRequest
1 голос
/ 02 октября 2009
<?xml version="1.0" encoding="ISO-8859-1"?>
 <bookstore>
  <book category="COOKING"> 
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>    
    <year>2005</year>
   <price>30.00</price>
  </book>

  <book category="CHILDREN">
   <title lang="en">Harry Potter</title>
   <author>J K. Rowling</author>
   <year>2005</year>
   <price>29.99</price>
  </book>

  <book category="WEB">
   <title lang="en">XQuery Kick Start</title>
   <author>James McGovern</author>
   <author>Per Bothner</author>
   <author>Kurt Cagle</author>
   <author>James Linn</author>
   <author>Vaidyanathan Nagarajan</author>
   <year>2003</year>
   <price>49.99</price>
  </book>

  <book category="WEB">
   <title lang="en">Learning XML</title>
   <author>Erik T. Ray</author>
   <year>2003</year>
   <price>39.95</price>
  </book>

</bookstore>

Можно ли использовать XPath для выбора полного набора первых узлов, например, из

 <book category="COOKING">  
  to 
 </book>, 

так, чтобы этот кусок xml мог быть сохранен для последующего использования.

Боб.

Ответы [ 4 ]

3 голосов
/ 02 октября 2009

Скажем, этот XML хранится в XmlDocument, называемом doc.

XmlElement docRoot = doc.DocumentElement;
XmlNode cookingNode = docRoot.SelectSingleNode("./book[@category='COOKING']");

Я проверил это и добавил эту строку, чтобы проверить:

Console.WriteLine(cookingNode.OuterXml);

Вот был вывод:

<book category="COOKING"><title lang="en">Everyday Italian</title><author>Giada
De Laurentiis</author><year>2005</year><price>30.00</price></book>
1 голос
/ 14 марта 2013

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

<book category="COOKING"> 
    <title lang="en">Everyday Italian</title>
    <author auth="up">Giada De Laurentiis</author>    
    <year>2005</year>
   <price>30.00</price>
  </book>

конечный результат в виде списка должен выглядеть следующим образом

  lang       auth
  en          up

Я кодировал следующим образом ..

XmlNodeList elemList = doc.GetElementsByTagName("book");
                    for (int j = 0; j < elemList.Count; j++)
                    {
                        if (elemList[j].Attributes["category"].Value == "COOKING")
                        {
                            XmlNodeList elemList1 = doc.GetElementsByTagName("author");
                            for (int i = 0; i < elemList1.Count; i++)
                            {
                                string attrVal = elemList1[i].Attributes["lang"].Value;
                                string attrVal1 = elemList1[i].Attributes["auth"].Value;

                                ListViewItem lvi = new ListViewItem();

                                    lvi.SubItems.Add(attrVal1);
                                    lvi.SubItems.Add(attrVal1);
                                }
                                listView1.Items.Add(lvi);
                            }
                        }
                    }
1 голос
/ 02 октября 2009

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

/bookstore/book[@category='COOKING']

как XmlDocument ...

var x = new XmlDocument();
x.Load("XmlFile1.xml");
var ns = x.SelectSingleNode("/bookstore/book[@category='COOKING']");

var res = ns.OuterXml;

как XDocument ...

var x = XDocument.Load("XmlFile1.xml");

var root = new XElement("bookstore",
    from book in x.Element("bookstore").Elements("book")
    where book.Attribute("category").Value == "COOKING"
    select book
    );

если вы просто хотите узел книги, вы можете сделать это вместо корневой версии выше

var book = x.Element("bookstore")
    .Elements("book")
    .Where(n => n.Attribute("category").Value == "COOKING")
    .First();
0 голосов
/ 02 октября 2009

Добавление к ответу Мэтью:

XmlDocument xDoc = new XmlDocument();
// (Put code to populate xDoc here)
XmlNodeList xNode = xDoc.SelectNodes(@"/bookstore/book[@category='COOKING']");

xNode теперь равен книге типа COOKING.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...