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);
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
@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. –
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. –