2011-02-07 36 views
1

我有這樣的XML文檔:過濾文件的屬性使用LINQ to XML

<?xml version="1.0" encoding="UTF-8"?> 
<teryt> 
<catalog name="TERC" type="all" date="2010-01-01"> 
<row> 
    <field name="Woj">1</field> 
    <field name="City">Warszawa</field> 
    <field name="Name">Mazowsze</field> 
</row> 
<row> 
    <field name="WojId">1</field> 
    <field name="City"/> 
    <field name="Name">Mazowsze</field> 
</row> 
<row> 
    <field name="Woj">2</field> 
    <field name="City"/> 
    <field name="Name">Slask</field> 
</row> 
</catalog> 
</teryt> 

現在我想不具有與屬性市域值僅行(使用LINQ to XML) 。

+1

您的XML無效。行沒有開始標記,第二個城市標記未正確關閉。 –

回答

3

你的意思是這樣的:

var rows = from row in doc.Root.Elements("rows") 
      where !row.Elements("field") 
        .Any(x => (string) x.Attribute("name") == "City" 
           && x.Value != "") 
      select row; 

,上面寫着:「找不具有任何非空field元素與City一個name屬性的所有行」。我認爲這就是你以後......

+0

x.Value將爲空,而不是「」,不是嗎? – TDaver

+0

@TDaver:不,它是一個空字符串。我剛剛嘗試過。 –

1

喜歡的東西:

var query = from row in xdoc.Descendants("row") 
      where row.Elements("field") 
        .Any(ff => ff.Attribute("name").Value == "City" 
          && String.IsNullOrWhitespace(ff.Value)) 
      select row; 

這是在找每一行無市值的願望前提。

1

將xml文檔加載到XDocument對象後,可以訪問它的標籤。所以你應該抓住你的XDocument的Root元素並使用Elements方法向下導航到行標記。當你把所有的標籤都放在一個集合中時,你可以選擇沒有城市字段的標籤。我幾乎可以確定xml元素上有一個HasValue屬性,它告訴你它是否有價值。但是,如果沒有一個,您可以檢查Value屬性,該屬性將爲空或爲空。

所以現在這一點代碼,順便我想:

XDocument doc = XDocument.Load("yourfile"); 
var tags = doc.Root.Element("catalog") 
        .Elements("row") 
        .Where(r=>r.Elements("field") 
         .Single(f=>f.Attribute("name").Value == "City" 
          && string.IsNullOrWhitespace(f.Value))); 

它翻譯成這樣的:取文件,選擇文檔的根,取名叫元素「目錄」 ,並給我所有的「行」元素,如果「row」有一個「name」屬性設置爲「City」的「field」元素,它爲空,空字符串或空白。

現在這可能不是那麼容易理解,如果你是新手,但這是我會這樣做的。您可以添加一些空檢查,但現在這取決於您。

+0

這將返回''元素而不是''元素。從我對OP的問題的理解(這可能是錯誤的)他想要''元素。 – user7116

+0

@sixlettervariables:你說得對,我修復了它。 – Tenshiko

+0

另外'Single'將會拋出一個異常,如果沒有完全匹配謂詞的元素。 – user7116