2010-06-09 25 views
11

Tôi đang phân tích cú pháp tài liệu xml, tôi cần tìm giá trị gid (thuộc tính) (3810).Cách nhận giá trị thuộc tính bằng cách sử dụng SelectSingleNode?

Dựa trên SelectSingleNode(). Tôi thấy nó không phải là dễ dàng để tìm tên thuộc tính và giá trị của nó.

Tôi có thể sử dụng phương pháp này hoặc tôi phải chuyển sang một cách khác.

Được đính kèm là mã của tôi.

Tôi làm cách nào để sử dụng book obj để nhận giá trị thuộc tính 3810 cho gid. Cảm ơn bạn.

file test.xml tôi như sau

<?xml version="1.0" ?> 
<root> 
    <VersionInfo date="2007-11-28" version="1.0.0.2" /> 
    <Attributes> 
     <AttrDir name="EFEM" DirID="1"> 
     <AttrDir name="Aligner" DirID="2"> 
      <AttrDir name="SequenceID" DirID="3"> 
       <AttrObj text="Slot01" gid="3810" unit="" scale="1" /> 
       <AttrObjCount value="1" /> 
      </AttrDir> 
     </AttrDir> 
     </AttrDir> 
    </Attributes> 
</root> 

tôi viết Test.cs như sau

public class Sample 
{  
    public static void Main() 
    {  
     XmlDocument doc = new XmlDocument(); 
     doc.Load("test.xml"); 

     XmlNode book; 
     XmlNode root = doc.DocumentElement; 

     book = root.SelectSingleNode("Attributes[AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']]"); 

     Console.WriteLine("Display the modified XML document...."); 
     doc.Save(Console.Out); 
    } 
} 

[Cập nhật 06/10/2010]

  1. Các xml tệp là một tệp phức tạp. Bao gồm hàng ngàn gids. Nhưng đối với mỗi Xpath, gid là duy nhất.

  2. Tôi tải tệp xml vào điều khiển TreeView. this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);. Khi sự kiện treeView1_AfterSelect xảy ra, e.Node.FullPath sẽ trở lại dưới dạng Giá trị chuỗi.

  3. Tôi phân tích chuỗi giá trị e.Node.FullPath. Sau đó, tôi đã nhận được thành viên của XPath ở trên. Sau đó, tôi đã cố gắng tìm mục gid nào đã được chọn.

Tôi cần tìm giá trị gid dưới dạng giá trị trả về thực sự.

Trả lời

4

Bạn có thể truy vấn XmlDocument bản thân không DocumentRoot:

XmlDocument doc = new XmlDocument(); 
XmlNode book = doc.SelectSingleNode(".."); 
if (book != null) 
{ 
    XmlAttribute gid = book.Attributes["gid"]; 
    if (gid != null) 
    { 
     string value = gid.Value; 
    } 
} 
+0

Với mã trong câu hỏi 'book.Attributes' trống (Đếm = 0). – ChrisF

+0

Xin chào. Từ 'book.Attributes.Count = 0', không thể tìm thấy' gid' trong thời gian chạy. –

+0

Thực tế, có hàng nghìn gid trong tập tin xml thật của tôi. Tôi muốn phân tích lớp phần tử bằng 'selectSingleNode()'. Tôi nghĩ đó là một phương pháp nhanh cho trường hợp của tôi. Sau đó, tôi có thể tìm thấy gid duy nhất. –

8

Bạn có thể viết

XmlAttribute gidAttribute = (XmlAttribute)book.Attributes.GetNamedItem("gid"); 
String gidValue = null; 
if (gidAttribute!=null) 
    value = gidAttribute.Value; 

Ngoài ra, mở rộng XPath để lấy thuộc tính, ví dụ

Attributes[AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']]/@gid 

Nếu @gid là duy nhất, sau đó bạn có thể chỉ cần sử dụng XPath

"//AttrObj[@gid='3810']" 

Để lấy nút mong muốn với id cụ thể. Nhưng lưu ý rằng mỗi yêu cầu sẽ tìm kiếm trong toàn bộ tài liệu. Nó sẽ hiệu quả hơn để tìm nạp tất cả các nút, và sau đó đặt chúng vào một bản đồ, được khóa bằng id.

"//AttrObj[@gid]" 

Sử dụng XmlNode.SelectNodes để tìm nạp danh sách tất cả AttrObj có thuộc tính @gid.

+0

Cho mã trong sách câu hỏi. Thuộc tính trống (Đếm = 0). – ChrisF

+0

btw, sẽ ném 'NullReferenceException' trong trường hợp không tìm thấy – abatishchev

+0

@mdma, tôi đã thử' book = root.SelectSingleNode ("Thuộc tính [AttrDir [@ name = 'EFEM']/AttrDir [@ name = 'Aligner']/AttrDir [@ name = 'SequenceID']/AttrObj [@ văn bản = 'Slot01']/@ gid] ");'. sách obj hoạt động tốt. nhưng Lỗi trình biên dịch cho 'XmlAttribute gidAttribute = book.Attributes.GetNamedItem (" gid ");': * lỗi CS0266: Không thể chuyển đổi hoàn toàn loại 'System.Xml.XmlNode' thành 'System.Xml.XmlAttribute'. Một chuyển đổi rõ ràng tồn tại (bạn có bỏ lỡ một dàn diễn viên không?) * –

0

Vấn đề ở đây là XPath của bạn đã sai.Bạn có điều này:

Attributes[AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']] 

sẽ chọn hoặc không chọn phần tử Thuộc tính tùy thuộc vào tất cả các tên trùng khớp. XPath này sẽ đưa bạn trực tiếp đến thuộc tính gid mà bạn muốn:

Attributes/AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']/@gid 
Các vấn đề liên quan