2010-03-16 59 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名稱。