Tôi muốn xem những giải pháp được đề xuất nào hoạt động tốt nhất, vì vậy tôi đã chạy một số thử nghiệm so sánh. Không quan tâm, tôi cũng so sánh các phương thức LINQ với phương thức System.Xml cũ đơn giản được đề xuất bởi Greg. Biến thể này rất thú vị và không như tôi mong đợi, với các phương pháp chậm nhất chậm hơn 3 lần so với nhanh nhất .
Các kết quả được sắp xếp theo thứ tự nhanh nhất đến chậm nhất:
- CreatReader - Instance Hunter (0.113 giây)
- Hệ thống cũ đơn giản.Xml - Greg Hurlman (0.134 giây)
- Tổng hợp với nối chuỗi - Mike Powell (0,324 giây)
- StringBuilder - Vin (0,333 giây)
- String.Join trên mảng - Terry (0,360 giây)
- String.Concat trên mảng - Marcin Kosieradzki (0.364)
phương pháp
Tôi đã sử dụng một tài liệu XML duy nhất với 20 nút giống hệt nhau (được gọi là 'gợi ý'):
<hint>
<strong>Thinking of using a fake address?</strong>
<br />
Please don't. If we can't verify your address we might just
have to reject your application.
</hint>
Các số được hiển thị như giây ở trên là kết quả của việc trích xuất "XML bên trong" của 20 nút, 1000 lần liên tiếp và lấy trung bình (trung bình) của 5 lần chạy. Tôi không bao gồm thời gian tải và phân tích cú pháp XML thành một XmlDocument
(cho phương thức System.Xml ) hoặc XDocument
(cho tất cả các phương thức khác).
Các thuật toán LINQ mà tôi đã sử dụng là: (C # - tất cả đều lấy XElement
"cha mẹ" và trả về chuỗi XML bên trong)
Trình tạo:
var reader = parent.CreateReader();
reader.MoveToContent();
return reader.ReadInnerXml();
Tổng hợp với nối chuỗi:
return parent.Nodes().Aggregate("", (b, node) => b += node.ToString());
StringBuilder:
StringBuilder sb = new StringBuilder();
foreach(var node in parent.Nodes()) {
sb.Append(node.ToString());
}
return sb.ToString();
String.Join trên mảng:
return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());
String.Concat trên mảng:
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());
Tôi chưa chỉ ra thuật toán "Plain old System.Xml" ở đây vì nó chỉ gọi .InnerXml trên các nút.
Phần kết luận
Nếu hiệu suất là quan trọng (ví dụ: nhiều XML, được phân tích cú pháp thường xuyên), tôi sẽ sử dụng CreateReader
phương pháp của Daniel mỗi lần . Nếu bạn chỉ đang thực hiện một vài truy vấn, bạn có thể muốn sử dụng phương pháp Tổng hợp ngắn gọn hơn của Mike.
Nếu bạn đang sử dụng XML trên các phần tử lớn có nhiều nút (có thể là 100), có lẽ bạn sẽ bắt đầu thấy lợi ích của việc sử dụng StringBuilder
phương thức Tổng hợp, nhưng không kết thúc CreateReader
. Tôi không nghĩ rằng các phương pháp Join
và Concat
sẽ trở nên hiệu quả hơn trong các điều kiện này vì hình phạt chuyển đổi một danh sách lớn thành một mảng lớn (thậm chí rõ ràng ở đây với các danh sách nhỏ hơn).