2010-03-24 108 views
2

我是用一定的XML工作,那裏有沒有冗餘避免裁員

<person> 
    <eye> 
    <eye_info> 
     <eye_color> 
     blue 
     </eye_color> 
    </eye_info> 
    </eye> 
    <hair> 
    <hair_info> 
     <hair_color> 
     blue 
     </hair_color> 
    </hair_info> 
    </hair> 
</person> 

正如你所看到的,子標籤睛彩提到了眼睛在它的名字,所以有沒有必要避免重複,我可以在加載XML到數據集後得到單行眼睛顏色:

dataset.ReadXml(path); 
value = dataset.Tables("eye_info").Rows(0)("eye_color"); 

我意識到這不是這樣做的最聰明的方式,而這種情況我有現在不是無法預料的。

現在,讓我們說我有讀取XML的是這種格式:

<person> 
    <eye> 
    <info> 
     <color> 
     blue 
     </color> 
    </info> 
    </eye> 
    <hair> 
    <info> 
     <color> 
     blue 
     </color> 
    </info> 
    </hair> 
</person> 

所以,如果我嘗試調用它像這樣:

dataset.ReadXml(path); 
value = dataset.Tables("info").Rows(0)("color"); 

會有冗餘,因爲我只能使用先前的方法來確定XML中的單個字段,並且「消除歧義者」位於上面的三個層次。

有沒有一種實際的方法可以在給定所有上述(或至少幾個)字段的情況下無誤地達到單個字段?

- [編輯] -

我做了另一個問題,問我怎麼能拿使用LINQ,check it out某個節點。

回答

4

您也可以使用LINQ到XML(System.Xml.Linq的命名空間)和檢索數據是這樣的

string xml = @"<persons> 
<person> 
    <eye> 
    <info> 
     <color>blue</color> 
    </info> 
    </eye> 
    <hair> 
    <info> 
     <color>blonde</color> 
    </info> 
    </hair> 
</person> 
<person> 
    <eye> 
    <info> 
     <color>green</color> 
    </info> 
    </eye> 
    <hair> 
    <info> 
     <color>brown</color> 
    </info> 
    </hair> 
</person> 
</persons>"; 

XDocument document = XDocument.Parse(xml); 

var query = from person in document.Descendants("person") 
      select new 
      { 
       EyeColor = person.Element("eye").Element("info").Element("color").Value, 
       HairColor = person.Element("hair").Element("info").Element("color").Value 
      }; 

foreach (var person in query) 
    Console.WriteLine("{0}\t{1}", person.EyeColor, person.HairColor); 
+0

我會和Linq一起去Xml,這很自然。 – 2010-03-24 14:32:03

+0

謝謝,我嘗試使用它時遇到問題..請檢查更新 – Marcelo 2010-03-25 11:40:46

2

圍繞從XML文檔查詢數據有一個完整的標準組織。該標準稱爲XPath,C#有一個實現。從盒子中學習並不是最容易的事情,但它是從XML中提取數據並且值得學習的最佳技術之一。

Here就是一個例子。編輯:我會建議你弄清楚LINQ到XML,但它更強大,但如果你仍然想要XPath那麼你的具體問題會看起來像(我沒有在這臺計算機上VS,所以我無法驗證這一點)...

XPathDocument doc = new XPathDocument(new StringReader(xmlString)); 
XPathNavigator nav = doc.CreateNavigator(); 

// Compile a standard XPath expression 
XPathExpression expr = nav.Compile("/person/eye/eye_info/eye_color"); 
expr = nav.Compile("/catalog/cd/price"); 
XPathNodeIterator iterator = nav.Select(expr); 

// Iterate on the node set 
while (iterator.MoveNext()) 
{ 
    XPathNavigator nav2 = iterator.Current.Clone(); 
    Console.WriteLine(nav2.Value); 
} 
+0

我會嘗試xpath出來!你能告訴我一個例子嗎?檢查問題 – Marcelo 2010-03-24 19:16:36

+0

中的更新有關一般XPath簡介,請查看http://www.w3schools.com/xpath/default.asp。在.net XPath中,可以通過XmlNode對象及其後代(即XmlDocument)上的SelectNode和SelectNodes方法。 – Martin 2010-03-24 21:41:34

0

記住DataSet類只能理解XML可以翻譯成表格的關係數據庫。特別是,它不會處理具有多個父「表」的單個子表「表」。將「信息」元素作爲人,頭髮和眼睛的孩子都是一個例子。