2012-10-16 24 views
8

Tôi đang lưu xml từ XElement của .NET. Tôi đã sử dụng phương thức ToString, nhưng định dạng không giống như cách tôi muốn (ví dụ bên dưới). Tôi muốn tối đa hai thẻ trên mỗi dòng. Làm thế nào tôi có thể đạt được điều đó?Viết xml với tối đa hai thẻ trên mỗi dòng


Tiết kiệm XElement.Parse("<a><b><c>one</c><c>two</c></b><b>three<c>four</c><c>five</c></b></a>").ToString() mang lại cho tôi

<a> 
    <b> 
    <c>one</c> 
    <c>two</c> 
    </b> 
    <b>three<c>four</c><c>five</c></b> 
</a> 

Nhưng để có thể đọc Tôi thà 'ba', 'bốn' và 'lăm' là trên dòng riêng biệt:

<a> 
    <b> 
    <c>one</c> 
    <c>two</c> 
    </b> 
    <b>three 
    <c>four</c> 
    <c>five</c> 
    </b> 
</a> 

Edit: Vâng Tôi hiểu điều này là khác biệt về cú pháp và "không thuộc về tinh thần của xml", nhưng tôi đang thực dụng. Gần đây tôi đã nhìn thấy các tệp xml kích thước megabyte với ít nhất 3 dòng — đây là những thách thức đối với các trình chỉnh sửa văn bản, kiểm soát nguồn và các công cụ khác. Một cái gì đó cần phải được thực hiện! Tôi đã thử nghiệm rằng việc thay đổi định dạng trên tương thích với ứng dụng của chúng tôi.

+2

+1 để bù đắp cho các phiếu giảm giá không giải thích được. Tuy nhiên, đây không phải là XML. Nếu bạn muốn nó là định dạng văn bản/miễn phí đơn giản, thì bạn có thể sử dụng cái gì khác. 'xmllint --format' thực hiện điều này nếu bạn thích – sehe

+0

Hi Sehe. Xmllint là một chương trình Linux - Có bất kỳ thứ gì có thể định dạng làm điều này cho .NET không? Và bạn có ý nghĩa gì 'đây không phải là những gì XML dành cho'? –

+0

Khi bạn nói rằng bạn đang cố gắng cải thiện khả năng đọc, điều này chỉ dành cho khi bạn (và có thể là các nhà phát triển khác) phải kiểm tra tệp cho mục đích gỡ lỗi? Nếu nó là một cái gì đó mà sẽ thường xuyên xảy ra liên quan đến mức độ thường xuyên một tập tin được lưu ra, sẽ đạt được kết quả thông qua sau chế biến được chấp nhận hoặc làm tất cả các tập tin cần phải được lưu ra với khoảng trắng thêm? – jerry

Trả lời

3

Lý do giải thích cho đồng nghiệp - chúng tôi sẽ thay đổi định dạng tệp. Tôi khuyên bạn nên thử làm như vậy. Đó là không thể làm những gì tôi muốn, bởi vì hầu hết các công cụ xml giả định khoảng trắng là đáng kể.

+3

Vấn đề là bạn có nút nội dung hỗn hợp - nếu bạn có thể loại bỏ nó, nó sẽ hoạt động. Trước khi thay đổi định dạng, hãy xem liệu việc triển khai XmlWriter của riêng bạn sẽ luôn đặt các phần tử trên dòng mới có thể giải quyết được các vấn đề cho bạn hay không. –

2

XML là một định dạng trao đổi thông tin, dành cho máy tính. Khoảng trắng là không liên quan (tùy thuộc vào vị trí và lược đồ, thực sự) và như vậy, nó sẽ là tùy ý để sử dụng một hoặc khác.

Bạn có thể sử dụng XmlTextWriter với XElement.Save và xem liệu bạn có thể tinh chỉnh nó theo ý thích của bạn với XmlWriter.Settings Property

+0

Điều này là sai WRT câu hỏi của mình - mỗi byte của khoảng trắng được hiển thị IS đáng kể, ngay cả khi chúng tôi không nghĩ rằng đó là ở cấp ứng dụng. –

+1

@JasonViers Với tất cả sự tôn trọng, ngữ cảnh được chỉ định bởi OP là linq-to-xml. Khoảng trống không có ý nghĩa trong mẫu như đã cho. Anh ấy chỉ muốn nó in đẹp. Đó là một bài thuyết trình và linq-to-xml không trực tiếp hỗ trợ nó. Ông có thể sử dụng một XmlWriter tùy chỉnh, mặc dù – sehe

+1

Tuyên bố của bạn là chính xác, nhưng chúng tôi đang đề cập đến các ngữ cảnh khác nhau. Ở cấp ứng dụng, theo như linq-to-xml có liên quan, nó không nghĩ rằng khoảng trắng là quan trọng. Trình nối tiếp XML không biết linq-to-xml có sự khác biệt (hoặc thiếu). Nó chỉ biết về đặc tả XML, và theo spec, tất cả khoảng trống trong ví dụ XML IS của anh ta đáng kể. –

3

Định dạng không hoạt động theo cách bạn muốn vì sự trần truồng "ba". Có lý do gì không có trong thẻ riêng của nó? Nếu đó là một thuộc tính của "b" thay vào đó?

13

Nếu bạn muốn chính xác kết quả đó, bạn sẽ cần phải thực hiện thủ công, thêm khoảng trống xung quanh các nút nếu cần.

Hầu như tất cả khoảng trống trong tài liệu XML đều quan trọng, ngay cả khi chúng tôi chỉ nghĩ về nó là thụt lề. Khi chúng tôi yêu cầu bộ nối tiếp thụt lề tài liệu cho chúng tôi, nó đang thực hiện các thay đổi đối với nội dung có thể được trích xuất, vì vậy, chúng cố gắng bảo toàn nhất có thể. Các yếu tố

<tag>foo</tag> 

<tag> 
    foo 
</tag> 

có nội dung khác nhau, và nếu một serializer thay đổi cựu thành sau này, nó sẽ thay đổi những gì bạn nhận lại từ API XML của bạn khi yêu cầu về nội dung của <tag> .

Quy tắc chung của ngón tay cái là không có thụt lề sẽ được áp dụng nếu có bất kỳ khoảng trắng không tồn tại nào giữa các phần tử. Trong trường hợp này, three của bạn giữa các thẻ sẽ được sửa đổi nếu một bộ nối tiếp áp dụng thụt lề mà bạn mong muốn, vì vậy không có gì sẽ tự động làm điều đó cho bạn.


Nếu bạn có quyền kiểm soát các định dạng XML, nó không lưu ý để trộn yếu tố và văn bản trẻ em như thế này, nơi <b> có cả văn bản (three) và yếu tố (<c>) trẻ em, vì nó gây ra các vấn đề như những gì bạn' nhìn lại.

0

Tôi đã phải làm điều gì đó tương tự trước đây (đối với yêu cầu của khách hàng). Tất cả những gì tôi đã làm là viết một phương thức .ToString() tùy chỉnh chỉ được sử dụng để hiển thị XML trong trình duyệt (ugh, tôi biết) hoặc cho việc sử dụng chúng trong việc tải xuống tệp xml của nội dung. Bởi vì mã không cần phải tính toán hiệu quả, nó chỉ là vấn đề kiểm tra con của mỗi thẻ và sắp xếp văn bản 'treo' như vậy.

Cuối cùng, chúng tôi có thể thuyết phục người dùng rằng văn bản phải là thuộc tính thay thế.

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