2010-03-23 55 views
0

我需要通過提供一個xml子元素的值作爲輸入來獲取xml文件的xml路徑。如何通過其值獲取XML路徑?

例如:

XML文件:

<?xml version="1.0"?> 
    <document-inquiry xmlns="http://ops.epo.org"> 
    <publication-reference data-format="docdb" xmlns="http://www.epo.org/exchange"> 
     <document-id> 
     <country>EP</country> 
     <doc-number>1000</doc-number> 
     <kind>A1</kind> 
     </document-id> 
    </publication-reference>  
    </document-inquiry> 

對於上述XML文件。我需要通過使用值「1000」來獲取XML路徑。 如果我輸入元素的值「1000」 輸出我需要的是:

<document-id> 
     <country>EP</country> 
     <doc-number>1000</doc-number> 
     <kind>A1</kind> 
    </document-id> 

我需要做到這一點使用C#代碼。任何人都可以請幫我在這...

+4

請不要大喊,今天早上我感覺有點嬌嫩。 – skaffman 2010-03-23 13:37:09

+1

編輯標題不要這麼大聲。 – 2010-03-23 13:38:53

+0

因此,您不需要獲取路徑作爲輸出 - 您需要祖先元素。也許改變問題標題,或者如果你確實需要路徑,就修改問題。 – 2010-03-23 13:40:29

回答

0

你可以使用XPathSelectElement擴展方法:

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

class Program 
{ 
    static void Main() 
    { 
     var doc = XDocument.Load("test.xml"); 
     var ns = new XmlNamespaceManager(new NameTable()); 
     ns.AddNamespace("ns", "http://www.epo.org/exchange"); 
     var elem = XDocument.Load("test.xml") 
      .XPathSelectElement("//ns:document-id[ns:doc-number='1000']", ns); 
     if (elem != null) 
     { 
      Console.WriteLine(elem.ToString()); 
     } 
    } 
} 

你可以使用XPathSelectElements如果你想選擇對應於這個標準的多個節點。

0

你可以用linq查詢來選擇你想要的元素。

var number = "1000"; 
var xml = XDocument.Parse(xml_string); 
XNamespace ns = "http://www.epo.org/exchange"; 

var result = (from data in xml.Descendants(ns + "document-id") 
      where data.Element(ns + "doc-number").Value == number 
      select data).FirstOrDefault(); 

.FirstOrDefault()返回第一個匹配元素或null。您可以改爲使用.List()來獲取包含所有匹配元素的列表。