2011-12-27 3 views
0

Это мой XML-файлпервый узел из XML

<?xml version="1.0"?> 
<catalog> 
    <book id="bk101"> 
     <author>Gambardella, Matthew</author> 
     <title>XML Developer's Guide</title> 
     <genre>Computer</genre> 
     <price>44.95</price> 
     <publish_date>2000-10-01</publish_date> 
     <description>An in-depth look at creating applications 
     with XML.</description> 
    </book> 
</catalog> 

И мне нужно прочитать имя автора, так это то, что я делаю:

XmlNodeList bookList = doc.GetElementsByTagName("book"); 

foreach (XmlNode node in bookList) 
{ 
    XmlElement bookElement = (XmlElement)node; 

    string title = bookElement.GetElementsByTagName("title")[0].InnerText; 
    string author = bookElement.GetElementsByTagName("author")[0].InnerText; 

    string isbn = ""; 
    if (bookElement.HasAttributes) 
    { 
     isbn = ""; 
     ; //bookElement.Attributes["ISBN"].InnerText 
    } 

    Console.WriteLine("{0} ({1}) is written by {2}\n", title, isbn, author); 
} 

Я не люблю использовать for цикл даже хотя я точно знаю, что он будет работать только один раз. Есть ли более чистый способ сделать это?

+1

вы можете использовать первый индекс Booklist как 'XmlElement bookElement = (XmlElement) bookList [0];', а затем вы можете удалить forloop –

ответ

1

«Современный» способ сделать это без for петель, чтобы написать код, используя LINQ to XML.

Этот код будет работать, если вы уверены, что в файле XML есть как минимум 1 книга. Он создает анонимный тип с 3 свойствами, Id, Author и Title.

using System.Linq; // requires assembly reference to System.Core.dll 
using System.Xml.Linq; // requires assembly reference to System.Xml.Linq.dll 

// ... 

XDocument document = XDocument.Load("yourfile.xml"); 
var book = 
    (from b in document.Descendants("book") 
    select new 
    { 
     Id = b.Attribute("id").Value, 
     Author = b.Element("author").Value, 
     Title = b.Element("title").Value 
    }).First(); 
0

Да, вы можете использовать XPATH.

Например, путь будет

/catalog/book[1]/author 
0

Если вы просто хотели, чтобы непосредственно искать «book.title» ... или все названия книг ...

Вы могли бы рассмотреть вопрос об использовании XPath (открытый стандарт) и/или LINQ (Microsoft только):

http://msdn.microsoft.com/en-us/library/bb882630%28v=vs.90%29.aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/ms753820%28v=vs.85%29.aspx

http://www.codeproject.com/KB/cpp/myXPath.aspx

0

Вы можете попробовать Linq XML (Import System.Xml.Linq).

Например,

XDocument doc = XDocument.Load(file); 
var nodeList = from ele in doc.Descendants("book") 
       select new 
        { 
        ID=(string)ele.Attribute("id"), 
        Author=(string)ele.Element("author") 
        }; // Or use FirstOrDefault(); to obtain first node 
foreach (var t in nodeList) 
    { 
    Console.WriteLine(t.ID + " " + t.Author); 
    } 
0

С тегами C#, если у вас есть по крайней мере .NET 3.5, то LINQ к XML, вероятно, самый простой (по крайней мере, имхо)

using System; 
using System.Xml.Linq; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var xml = @"<?xml version=""1.0""?> 
         <catalog> 
          <book id=""bk101""> 
           <author>Gambardella, Matthew</author> 
           <title>XML Developer's Guide</title> 
           <genre>Computer</genre> 
           <price>44.95</price> 
           <publish_date>2000-10-01</publish_date> 
           <description>An in-depth look at creating applications 
           with XML.</description> 
          </book> 
         </catalog>"; 
     XElement e = XElement.Parse(xml); 

     var books = e.Elements("book"); 

     foreach (var book in books) 
     { 
      var title = book.Element("title").Value; 
      var author = book.Element("author").Value; 
      var isbn = book.Attribute("id").Value; 

      Console.WriteLine("{0} ({1}) is written by {2}", title, isbn, author); 
     } 
    } 
} 
+0

и, как сказал бобби, если вы знаете, что есть хотя бы одна книга, вы можете просто сделать var book = books.First(); –

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