2014-02-24 141 views
0

我是新來的linq到xml(linq任何東西,對於這個問題),我試圖計算XML文件中的元素數量,但排除一些。這裏有一個例子:返回除了沒有值的特定元素之外的所有元素

<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> 
     <binding>paperback</binding> 
    </book> 
    <book id="bk102"> 
     <author>Ralls, Kim</author> 
     <title>Midnight Rain</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
     <publish_date>2000-12-16</publish_date> 
     <description>A former architect battles corporate zombies, 
     an evil sorceress, and her own childhood to become queen 
     of the world.</description> 
     <binding></binding> 
    </book> 
</catalog> 

鑑於上述xml,我想返回所有元素,除了沒有值的元素。所以在這種情況下的最終數量是16,因爲我不想計算空的元素。

+0

當你說元素沒有價值。你什麼意思?綁定是一個元素,並沒有一個值。你的意思是一本書的元素? – 2014-02-24 23:27:06

+0

我的意思是一個特定的元素,在這種情況下,。正如你可以看到我的XML,第二本書有一個元素沒有價值。我想要返回一切,但那一個。假設xml數量更多,有數千本書,我想返回所有元素,除了所有沒有價值的元素。所以僞代碼可能是「讀取xml文件減去元素名稱」綁定「值爲空」。 – u84six

+0

我明白了。下面的任何解決方案都可以工作。然而,如果你認爲一個元素可能包含空格,那麼你需要使用下面的我的版本(string.IsNullOrWhiteSpace)。如果你需要這兩個元素和他們的計數,那麼你應該使用.ToList()然後訪問.Count屬性。 – 2014-02-25 03:02:23

回答

0

我沒有嘗試,但是這會工作:

var xDoc = XDocument.Load("path"); 
var count = xDoc.Descendants() 
      .Count(x => !string.IsNullOrEmpty((string)x)); 

如果您希望元素只是用Where代替Count

2
int count = XDocument.Load(@"C:\books.xml") 
      .Descendants() 
      .Where(x => !String.IsNullOrWhiteSpace(x.Value)) 
      .Count(); 
0

這就是我想出了用所有幫助。不知道它是否非常有效,但它的工作原理:

XDocument doc = XDocument.Load(@"C:\books.xml"); 
var elementList = doc.Descendants().ToList(); 
int count = elementList.Count(); 
count -= elementList.Where(x => x.Name == "binding" && String.IsNullOrEmpty(x.Value)).Count(); 
+0

如果您的XML內容不是很大,那麼在性能方面就會好。 – 2014-02-25 20:07:32

相關問題