Tìm kiếm theo TagName và XPath

Tìm kiếm một element trong XML là công việc được thực hiện rất phổ biến. Ta tìm kiếm các element chủ yếu qua tên, thuộc tính của element đó.
Để thực hiện tìm kiếm, ta có thể sử dụng GetElementsByTagName() của XmlDocument để lấy về danh sách các node XmlNodeList hoặc sử dụng XPath – là một cách cao cấp hơn.

1. Tìm kiếm theo XmlNodeList
Trong ví dụ sau, ta sẽ tìm tên của diễn viên đóng trong phim “Tear of the Sun”.
Ta sẽ bắt đầu với việc tìm các DVD có Title = "Tear of the Sun" bằng hàm GetElementsByTagName("Title"). Sau đó ta sẽ duyệt các DVD này và tìm tên các diễn viên tham gia.

static void Main(string[] args)
{
    string fileName = "DVDList.xml";
    string content = SearchByXMLNodeList(fileName);
}

private static string SearchByXMLNodeList(string fileName)
{
    XmlDocument xmlDocument = new XmlDocument();

    xmlDocument.Load(fileName);

    // Search all film's title
    XmlNodeList nodeList = xmlDocument.GetElementsByTagName("Title");

    StringBuilder sb = new StringBuilder();

    foreach (XmlNode node in nodeList)
    {
         string title = node.ChildNodes[0].Value;
         sb.AppendLine(title);

         if (title.Equals("Tear of the Sun"))
         {
              XmlNode parentNode = node.ParentNode;

              XmlNodeList starList = 
                 ((XmlElement)parentNode).GetElementsByTagName("Star");

              foreach (XmlNode star in starList)
              {
                   sb.Append("   - Star: ");
                   sb.AppendLine(star.ChildNodes[0].Value);
              }
         }
     }

     return sb.ToString();
}

2. Tìm kiếm theo XPath
Sử dụng GetElementByTagName() thực sự có rất nhiều hạn chế. Phương thức này chỉ cho phép ta tìm kiếm theo tên của element.
Việc này khiến người ta suy nghĩ đến một cách thức tìm kiếm cho phép lọc dữ liệu theo element và theo thuộc tính. XPath hoạt động theo phương thức này
Cấu trúc XML có dạng cây, XPath có dạng là đường dẫn từ Root đến bất kỳ node hay attribute nào. Sử dụng phương thức SelectNodes() của XmlDocument để tìm kiếm một node bất kỳ

Ví dụ về sử dụng XPath
- Tìm các tên phim thuộc vào Category
xPath = "/DVDList/DVD/Title[../@Catagory='War']";
- Tìm Category của DVD có ID = 2
xPath = "/DVDList/DVD/@Catagory[../@ID='2']";
- Tìm DVD mà Title bắt đầu bằng chữ 't'
xPath = "/DVDList/DVD[starts-with(Title,'t')]";
- Tìm DVD mà Title có chứa chữa 't'
xPath = "/DVDList/DVD[contains(Title,'t')]";
- Tìm mã số ID của các phim mà có diễn viên Bruce Willis tham gia
xPath = "/DVDList/DVD/@ID[../Stars/Star='Bruce Willis']";
- Tìm các DVD có ID >= 2
xPath = "/DVDList/DVD[@ID >= 2]";
- Tìm các DVD phát hành sau ngày 08/06/2008
xPath = "/DVDList/DVD[translate(@Date,'/','') > 08062008]";

 

private static string SearchByXPath(string fileName)
{
    // Create document
    XmlDocument xmlDocument = new XmlDocument();

    // Load xml's content to memory
    xmlDocument.Load(fileName);

    // Get DVD's ID that Bruce Willis cast
    xPath = "/DVDList/DVD/@ID[../Stars/Star='Bruce Willis']";

    // Select nodes by XPath
    XmlNodeList nodeList = xmlDocument.SelectNodes(xPath);

    StringBuilder sb = new StringBuilder();

    foreach (XmlNode node in nodeList)
    {
        sb.AppendLine(node.ChildNodes[0].Value);
    }

    return sb.ToString();
 }

File XML dùng trong ví dụ

 

DVDList.xml (1,15 kb)