2010-03-23 53 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()来获取包含所有匹配元素的列表。