2010-03-16 61 views
2

我有一个XML文件如下,我试图读取名称标签的内容,只有当记录标签的属性是我想要的。 (续下面的代码)XML/C#:阅读内容,如果只有属性是正确的

XML文件是:

<?xml version="1.0" encoding="utf-8" ?> 
<Database> 
    <Record Number="1"> 
    <Name>John Doe</Name> 
    <Position>1</Position> 
    <HoursWorked>290</HoursWorked> 
    <LastMonthChecked>0310</LastMonthChecked> 
    </Record> 
    <Record Number="2"> 
    <Name>Jane Doe</Name> 
    <Position>1</Position> 
    <HoursWorked>251</HoursWorked> 
    <LastMonthChecked>0310</LastMonthChecked> 
    </Record> 
</Database> 

这是C#代码,我到目前为止有:

public static string GetName(int EmployeeNumber) 
     { 
      XmlTextReader DataReader = new XmlTextReader("Database.xml"); 
      DataReader.MoveToContent(); 
      while (DataReader.Read()) 
      { 
       if (DataReader.NodeType == XmlNodeType.Element 
        && DataReader.HasAttributes && DataReader.Name == "Record") 
       { 
        DataReader.MoveToAttribute(EmployeeNumber); 
        DataReader.MoveToContent(); 
        if (DataReader.NodeType == XmlNodeType.Element 
         && DataReader.Name == "Name") 
        { 
         return DataReader.ReadContentAsString(); 
        } 
       } 
      } 
     } 

因此,举例来说,如果2被传递给函数,我希望它返回字符串"Jane Doe"。我是新来的XML解析,所以任何帮助,将不胜感激。

谢谢。

+0

数据是如此之大,以至于将整个文档加载到'XmlDocument'(然后使用'SelectSingleNode()等)是不实际的? – 2010-03-16 08:40:24

回答

1
Could you try something like this:- 

     public static string GetName(int EmployeeNumber) 
     { 
     XmlDocument doc = new XmlDocument(); 
     doc.Load("Database.xml"); 
     XmlElement rootNode = doc.DocumentElement; 

     String query ="Record[@Number='"+EmployeeNumber.ToString()+"']/Name"; 
     XmlNode data= rootNode.SelectSingleNode(query); 
     return data.InnerText; 
     } 
1

,如果你的XML是不是非常大,您可以使用XPath:

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

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var elements = XDocument.Load("Database.xml") 
      .XPathSelectElements("//Record[@Number='2']/Name"); 
     foreach (var item in elements) 
     { 
      Console.WriteLine(item.Value); 
     } 
    } 
} 
1
string searchTerm = "2"; 

var list = from XElement segment in workingXmlDocument.Descendants(wix + "File") 
      where segment.Attribute("Id").Value.ToString() == searchTerm 
      select segment.Descendant("Name").Value; 

这是一个LINQ声明,这将使你基于变量SEARCHTERM名称。