2012-11-13 50 views
2

我是C#的初學者。如何纔能有效地解析這個XML?

更大箱子簡單的例子:

輸入:

<?xml version="1.0" encoding="utf-8"?> 
<products> 
    <product> 
    <id>1</id> 
    <name>John</name> 
    </product> 
    <product> 
    <id>2</id> 
    <name>Tom</name> 
    </product> 
    <product> 
    <id>3</id> 
    <name>Sam</name> 
    </product> 
</products> 
</xml> 

輸出(對於ID = 1):

<id>2</id> 
<name>Tom</name> 

我的部分代碼的嘗試psedocode:

XDocument doc=XDocument.Parse("............."); 

var els= doc.Descendants("product"); 
foreach(e in els){ 
    node=e.Element("id"); 
    if(2==node.Value){ 
    return e; 
    } 
} 

請幫幫忙,

感謝

回答

4

目前XML文件沒有得到很好的格式 - 刪除文件關閉</xml>標籤,使之有效。這裏是查詢:

int id = 1; 
XDocument xdoc = XDocument.Load(path_to_xml); 
var product = xdoc.Descendants("product") 
        .Where(p => (int)p.Element("id") == id) 
        .SingleOrDefault(); 

如果比賽沒有發現這個查詢將返回整個<product>元素或null

而且我相信產品的名稱就足夠讓你選擇(因爲你已經擁有的產品ID):爲id = 2

+0

謝謝,但它給編譯錯誤 – Yosef

+0

@Yosef剛剛驗證 - 對我來說沒有錯誤。你有沒有修復你的XML文件?你收到什麼樣的錯誤? –

+1

修復包含的軟件包 - 它的工作原理! – Yosef

1

var name = xdoc.Descendants("product") 
       .Where(p => (int)p.Element("id") == id) 
       .Select(p => (string)p.Element("name")) 
       .SingleOrDefault(); 

返回Tom你可能會尋找的XPath:

root.XPathSelectElements(@"//products/product/id[text()='2']") 

編輯評論內容:直接獲取名稱://products/product/id[text()='2']/../name

查看完整的例子

using System.Xml.Linq; 
using System.Xml.XPath; 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     var doc = XDocument.Parse(XML); 
     foreach(var n in doc.Root.XPathSelectElements(
       @"//products/product/id[text()='2']")) 
     { 
      System.Console.WriteLine("Not that hard: '{0}'", n.Parent.Element("name").Value); 
     } 

     // Direct query for name: 
     foreach(var n in doc.Root.XPathSelectElements(
       @"//products/product/id[text()='2']/../name")) 
     { 
      System.Console.WriteLine("Directly: '{0}'", n.Value); 
     } 
    } 

    private const string XML = 
    @"<?xml version=""1.0"" encoding=""utf-8""?> 
     <products> 
      <product> 
       <id>1</id> 
       <name>John</name> 
      </product> 
      <product> 
       <id>2</id> 
       <name>Tom</name> 
      </product> 
      <product> 
       <id>3</id> 
       <name>Sam</name> 
      </product> 
     </products>"; 
} 

印刷:

Not that hard: 'Tom' 
Directly: 'Tom' 
+0

謝謝,我還需要打印「姓名」 – Yosef

+0

@Yosef你爲什麼不呢? 'Console.WriteLine(「Not that hard:'{0}'」,n.Parent.Element(「name」)。Value)'。打印_不那麼難:'湯姆'_ – sehe

+0

@Yosef我已經調整了示例,以顯示一個XPath,直接查詢名稱,而不是 – sehe

1

這將返回product(如你的問題)不是id

var product = doc.XPathSelectElement("//product[id and id[text() = '1']]");