2009-09-23 37 views
12

Tôi có tệp xml lớn này chứa nhiều nhận xét.nhận xét dải từ tệp xml và in đẹp nó

Whats "cách tốt nhất" để loại bỏ tất cả các nhận xét và định dạng độc đáo xml từ dòng lệnh linux?

+0

Bản sao có thể có của [Xóa nhận xét XML bằng Regex trong bash] (http://stackoverflow.com/questions/19230407/remove-xml-comments-using-regex-in-bash) – malat

Trả lời

17

bạn có thể sử dụng gọn gàng

$ tidy -quiet -asxml -xml -indent -wrap 1024 --hide-comments 1 tomcat-users.xml 
<?xml version='1.0' encoding='utf-8'?> 
<tomcat-users> 
    <user username="qwerty" password="ytrewq" roles="manager-gui" /> 
</tomcat-users> 
+0

Thêm "-todify" vào các tham số để thay đổi tệp tại chỗ. (Bạn đã sao lưu, phải không?) –

7

Bạn có thể muốn xem công cụ xmllint. Nó có một số tùy chọn (một trong số đó --format sẽ thực hiện một bản in đẹp), nhưng tôi không thể tìm ra cách xóa nhận xét bằng công cụ này.

Ngoài ra, hãy xem XMLStarlet, một loạt các công cụ dòng lệnh để làm bất kỳ điều gì bạn muốn với xml. Sau đó làm:

xml c14n --without-comments # XML file canonicalization w/o comments 

EDIT: OP cuối cùng sử dụng dòng này:

xmlstarlet c14n --without-comments old.xml > new.xml 
+0

xmllint là giao diện cmdline cho libxml2 , một thư viện với các ràng buộc cho nhiều ngôn ngữ. Ví dụ. Tôi sử dụng XML :: LibXML trong Perl. – reinierpost

+0

Tôi sử dụng evntually: xmlstarlet c14n --without-comments old.xml> new.xml – elcuco

-2

Cách tốt nhất là nên sử dụng một phân tích cú pháp XML để xử lý tất cả các trường hợp góc tối nghĩa một cách chính xác. Nhưng nếu bạn cần một cái gì đó nhanh chóng và bẩn, có một loạt các short solutions using Perl regexes mà có thể là đủ.

+3

Không sử dụng regexes trên XML. – reinierpost

+0

@reinierpost: Tôi hiểu tại sao câu trả lời này có vẻ khó chịu.Nhưng nếu đây là một lần, và bạn biết ý kiến ​​của bạn là một tập hợp con bị hạn chế của thông số nhận xét, thì có gì sai với một giải pháp regex? Tôi đồng ý một công cụ phân tích là thích hợp hơn (và là câu trả lời hay nhất), nhưng tôi nghĩ đây là một lựa chọn hợp lệ trong một số tình huống cụ thể (ví dụ: thử nghiệm đơn giản hoặc chú thích 2AM về khủng hoảng trên hệ thống chỉ đọc) và có thể khá thuận tiện . –

+0

Với một XML hợp lệ và do đó chỉ có các chú thích là các bình luận, tôi nghĩ XML parser là tốt hơn. Tuy nhiên, nếu bạn xử lý HTML với các nhận xét bao gồm các điều kiện (nghĩa là Internet Explorer) thì regex có lẽ là đặt cược tốt nhất của bạn. –

10

Chạy XML của bạn thông qua một identity transform XSLT, với mẫu trống cho nhận xét.

Tất cả nội dung XML, ngoại trừ nhận xét, sẽ được chuyển đến đầu ra.

Để niecely định dạng đầu ra, thiết lập đầu ra @ indent = "yes":

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<!--Match on Attributes, Elements, text nodes, and Processing Instructions--> 
<xsl:template match="@*| * | text() | processing-instruction()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<!--Empty template prevents comments from being copied into the output --> 
<xsl:template match="comment()"/> 

</xsl:stylesheet> 
0

Để dọn dẹp một cái gì đó đơn giản như server.xml Tomcat , Tôi sử dụng

sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' | grep -v "^\s*$" 

Tức là

function tidy() { 
echo "$(cat $1 | sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' | grep -v "^\s*$")" 
} 

tidy server.xml 

... sẽ in xml không có nhận xét.

LƯU Ý: mặc dù nó hoạt động khá tốt cho những thứ đơn giản, nó sẽ thất bại với một số khối CDATA nhất định và một số tình huống khác. Chỉ sử dụng nó cho các tập lệnh xml được kiểm soát mà không cần và sẽ không bao giờ cần phải thoát khỏi một số <-- hoặc --> bất kỳ đâu!

Dấu đầu tiên của chú thích bắt đầu và dừng với 0x0 ký tự, sau đó grep với -z xử lý 0x0 làm dấu phân tách dòng duy nhất, tìm kiếm dòng bắt đầu bằng nhận xét, nó v đảo ngược bộ lọc, chỉ để lại các dòng có ý nghĩa. Cuối cùng, tr -d \ 0` xóa tất cả các 0x0 này, và để đánh bóng nó lên, grep khác loại bỏ các dòng trống: thì đấy.

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