2010-11-15 26 views
8

Tôi đang phát xung quanh với phân tích cú pháp luồng XML XMPP. Điều phức tạp về luồng XML là thẻ bắt đầu không bị đóng cho đến cuối phiên, tức là một DOM hoàn chỉnh không bao giờ được nhận.Đọc XElement từ XmlReader

<stream:stream> 
    <features> 
     <starttls /> 
    </features> 
    .... 
    network session persists for arbitrary time 
    .... 
</stream:stream> 

Tôi cần phải đọc các phần tử XML từ luồng mà không quan tâm rằng phần tử gốc chưa được đóng.

Lý tưởng nhất điều này sẽ hiệu quả nhưng không và tôi giả sử đó là do người đọc đang đợi phần tử gốc được đóng.

XElement someElement = XNode.ReadFrom(xmlReader) as XElement; 

Đoạn code dưới đây (mà tôi mượn từ Jacob Reimers) không làm việc nhưng tôi hy vọng có một cách hiệu quả hơn mà không liên quan đến việc tạo ra một XmlReader mới và làm các phân tích chuỗi.

XmlReader stanzaReader = xmlReader.ReadSubtree(); 
stanzaReader.MoveToContent(); 
string outerStanza = stanzaReader.ReadOuterXml(); 
stanzaReader.Close(); 
XElement someElement = XElement.Parse(outerStanza); 

Trả lời

10

Bạn không cần phải làm việc với các chuỗi; bạn nên có thể sử dụng XElement.Load trên cây con:

XElement someElement; 
using(XmlReader stanzaReader = xmlReader.ReadSubtree()) { 
    someElement = XElement.Load(stanzaReader); 
} 

Và lưu ý rằng đây không phải là thực sự là một "mới" xml-reader - đó là nặng nề gắn liền với người đọc ngoài (nhưng hạn chế đến một tập của các nút).

+0

Với ví dụ của bạn, tôi không thể thấy lý do tại sao XmlReader stanzaReader = XElement.Load (xmlReader.ReadSubtree()) sẽ không thực hiện công việc. Tôi vẫn sẽ có xmlReader trong một khối sử dụng và sẽ xử lý mọi việc dọn dẹp. – sipwiz

+0

@sipwiz - trong trường hợp cụ thể đó, bạn có thể sẽ bỏ đi với nó; Tôi chỉ ăn sâu: vứt bỏ * mọi * 'IDisposable', kịp thời. 'stanzaReader' là một đối tượng khác, cuối cùng. –

+0

Các phiên bản trước đó của trình phân tích kéo của .net sẽ đợi 4kB tại một thời điểm để đệm. Đó là lý do tại sao tôi đã kết thúc việc chuyển trình phân tích cú pháp XP của James Clark từ Java sang C# cho jabber-net. –

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