2012-08-16 88 views
0

美好的一天,C#查詢XML文檔

我想查詢一個XML文檔,有以下查詢:

XElement root = XElement.Load(@"..\..\Data.xml"); 
var entries = root.Descendants() 
       .Where(x => x.Name.LocalName == "Entry") 
       .ToList(); 

Console.WriteLine("There are {0} nodes...", entries.Count()); 
foreach (XElement v in entries) 
{ 
    Console.WriteLine(v.Value); 
} 

與此代碼的工作,因爲它拉入口節點的正確數目。該條目 節點樣子:

<?xml version="1.0" encoding="UTF-8"?> 
<Database xmlns="http://www.someurl.org/schemas"> 
    <InfoFromRecord> 
     <BaseData> 
      <Entry> 
       <Date>2006-03-08</Date>XD 
       <Time>09:20:00</Time> 
       <EnteredBy>DNS</EnteredBy> 
       <TextEntry>Record 1</TextEntry> 
      </Entry> 
      <Entry> 
       <Date>2006-03-08</Date> 
       <Time>09:33:00</Time> 
       <EnteredBy>MW</EnteredBy> 
       <TextEntry>Record 2</TextEntry> 
      </Entry> 
      <Entry> 
       <Date>2006-03-08</Date> 
       <Time>08:58:00</Time> 
       <EnteredBy>BH</EnteredBy> 
       <TextEntry>Record 3</TextEntry> 
      </Entry> 
     </BaseData> 
    </InfoFromRecord> 
</Database> 

的問題是,我想只提取日期和時間,不是所有的四個字段。

回答

3

讓我們假設你的整個XML文件是這樣一個明顯的例子:

<Entries> 
    <Entry> 
     <Date>2006-03-08</Date> 
     <Time>09:33:00</Time> 
     <EnteredBy>XX</EnteredBy> 
     <TextEntry>Test Data</TextEntry> 
    </Entry> 
</Entries> 

然後,您可以做這樣的事情:

var document = XDocument.Load(@"..\..\Data.xml"); 
var dateAndTimes = 
    from d in document.Root.Descendants("Entry") 
    select new 
       { 
        Date = d.Element("Date").Value, 
        Time = d.Element("Time").Value 
       }; 

從那裏,dateAndTimes類型將選擇日期和時間的anonymous type。您可以將匿名類型更改爲您自己的類型或其他類型。


編輯:問題是你xmlns。改變你的代碼是這樣的:

XNamespace namespc = "http://www.someurl.org/schemas"; 
var document = XDocument.Parse(xml); 
var dateAndTimes = 
    from d in document.Root.Descendants(namespc + "Entry") 
    select new 
       { 
        Date = d.Element(namespc + "Date").Value, 
        Time = d.Element(namespc + "Time").Value 
       }; 
+0

我試過了,它沒有工作。它看起來像document.Root.Descendants(「Entry」)中沒有任何內容。我認爲後裔會得到文件中的任何節點。 – coson 2012-08-16 16:08:16

+0

@coson編輯與更新回答。命名空間沒有被考慮在內。 – vcsjones 2012-08-16 16:14:06

+0

工作。原來,沒有前綴的默認名稱空間需要考慮。 – coson 2012-08-16 16:17:41

0
foreach (XElement v in entries) 
{ 
    Console.WriteLine(v.Element("Date").Value); 
    Console.WriteLine(v.Element("Time").Value); 
} 

不要忘記Descendants在任何級別,即兒童,盛大的孩子,等孩子發現其中Elements只找到直接的孩子。所以我想Elements是大多數情況下的安全選擇。

編輯:看到XML

後,您需要包括Namspace也獲得數據

XNamespace ns = "http://www.someurl.org/schemas"; 
var entries = elm.Descendants().Where(x => x.Name.LocalName == "Entry").ToList(); 
foreach (XElement v in entries) 
{ 
    Console.WriteLine(v.Element(ns+"Date").Value); 
    Console.WriteLine(v.Element(ns+"Time").Value); 
} 
+0

對不起,我試過這個,它不工作。我得到一個空引用異常 – coson 2012-08-16 15:53:37

+0

你可以發佈你的xML嗎? – Shyju 2012-08-16 15:56:21

+0

我現在把整個文檔放在那裏。 – coson 2012-08-16 16:08:57

0

的時候我還沒有機會嘗試,但像下面可能給你你在找什麼

var entries = from i in root.Descendants() 
where Name=='entry' 
let date = i.Element('Date').Value 
let time = i.ELement('Time').Value 
select new Tuple<string,string>(date,time);