2009-03-07 26 views

Trả lời

35

Tận dụng giao diện IXmlLineInfo được hỗ trợ bởi một XmlReader:

IXmlLineInfo xmlInfo = (IXmlLineInfo)reader; 
int lineNumber = xmlInfo.LineNumber; 
+2

Có vẻ như thực hành không tốt. Vì XmlReader không kế thừa IXmlLineInfo nên việc triển khai lớp trừu tượng này có thể không thực hiện giao diện. Một kiểm tra hỗ trợ giao diện là cần thiết. – SerG

+1

Vui lòng sử dụng IXmlLineInfo xmlInfo = reader dưới dạng IXmlLineInfo; Thực hành mã tốt này. @shuvra – Shuvra

1

Mở rộng trên giao diện IXmlLineInfo, các tài liệu hướng dẫn cho điều này là khá xấu; từ một chút đào, tôi có thể cho bạn biết những điều sau đây:

1) System.Xml.XmlReader là trừu tượng, vì vậy bạn sẽ không bao giờ phải xử lý một trường hợp này, thực tế là nó không thực hiện IXmlLineInfo không ồ ạt về (mặc dù, nếu nó đã làm, nó sẽ làm cho tất cả mọi thứ chỉ là một chút dễ dàng hơn :))

2) giao diện System.Xml.IXmlLineInfo cung cấp hai tính chất: LineNumberLinePosition (mà là những điều chúng ta quan tâm) , cộng với phương thức: HasLineInfo(), theo tài liệu, sẽ cho bạn biết nếu người triển khai có thể trả về dòng thông tin.

3) Trong số những người thừa kế tài liệu của System.Xml.XmlReader, ta có:

System.Xml.XmlDictionaryReader - abstract, used by WCF for serialization, no IXmlLineInfo 
System.Xml.XmlNodeReader - used when reading a node, no IXmlLineInfo 
System.Xml.XmlTextReader - used when reading a stream of data, has IXmlLineInfo 
System.Xml.XmlValidatingReader - used when reading a stream of data and validating, has IXmlLineInfo. 

Nhìn vào danh sách trên, các XmlDictionaryReader sẽ được sử dụng trong nội bộ, các XmlNodeReader sẽ được sử dụng khi bạn đã vượt qua trong một nút được đọc (mà đã được phân tích cú pháp, đã được untethered từ tài liệu nguồn của nó), XmlTextReaderXmlValidtingReader (cả hai đều thực hiện IXmlLineInfo), sẽ được sử dụng khi bạn đọc từ một tài liệu. Vì vậy, dài và ngắn của nó có vẻ là nếu nó có thể hoặc hữu ích để cung cấp cho bạn thông tin vị trí, khuôn khổ sẽ làm như vậy.

Điều đó đang được nói, tài liệu dường như rất nhẹ. Vừa mới làm được điều này, tôi đã kết thúc làm (với _xr là một thực hiện cụ thể không rõ của System.Xml.XmlReader):

string position = "(unknown)"; 
    if (_xr != null && typeof(System.Xml.IXmlLineInfo).IsInstanceOfType(_xr) && 
((System.Xml.IXmlLineInfo)_xr).HasLineInfo()) 
    { 
     System.Xml.IXmlLineInfo li = (System.Xml.IXmlLineInfo)_xr; 
     position = "(" + li.LineNumber.ToString() + "," + li.LinePosition.ToString() + ")"; 
    } 

Với tất cả điều đó đang được nói, khi tôi thực sự chạy đoạn mã trên, các loại _xr kết thúc lên được System.Xml.XsdValidatingReader (chúc may mắn tìm tài liệu về điều đó!), Được kế thừa từ System.Xml.XmlReader, nhưng không kế thừa từ System.Xml.XmlValidatingReader hoặc System.Xml.XmlTextReader. Như vậy, có thể là khôn ngoan khi sử dụng cách tiếp cận như trên.

Các vấn đề liên quan