2014-04-01 14 views
5

Sự cố này xuất hiện gần đây. Tôi đã sử dụng kiến ​​cho eons và biết tôi có thể 'hack xung quanh' vấn đề này, nhưng nghĩ để hỏi: không ant cung cấp một giải pháp thanh lịch cho usecase này?Ant: Cách xml-thoát giá trị thuộc tính khi sao chép các tệp xml có "lọc"

Vấn đề

Khi tôi sử dụng kiến ​​để sao chép các file xml và "cư giá trị" bằng cách sử dụng thuộc tính "lọc", làm thế nào tôi có thể làm cho nó tự động thoát ampersands (và xml khác 'ký tự đặc biệt')?

Context

Thay vì phải cài đặt/người thực hiện bằng tay chỉnh sửa tất cả các file cấu hình cụ thể ứng dụng máy chủ khác nhau, chúng tôi có họ chỉnh sửa một file 'build.properties' trong thư mục gốc ứng dụng của chúng tôi. bản Ant một phiên bản 'nguồn' được cấu hình sẵn của tập tin vào một thư mục 'mục tiêu' trong khi Populating giá trị từ các thuộc tính tập tin

1) Build.properties có giá trị này:

JDBC_PASSWORD=smith&wesson 

2) "Nguồn "tập tin cấu hình có yếu tố này:

<local-tx-datasource> 
    ... 
    <password>@[email protected]</password> 
    ... 
    </local-tx-datasource> 

3) bản sao Ant các file xml từ thư mục cấu hình 'nguồn' và populates 'JDBC_PASSWORD' (trong những khách sạn khác) với 'lọc' thuộc tính:

<copy todir="${appserver.home.dir}" filtering="yes"> 
    <fileset dir="${appserver.conf.dir}"> 
     <include name="**/*.xml"/> 
    </fileset> 
</copy> 

4) Vì thuộc tính có dấu và, tệp xml 'đích' kết quả không hợp lệ. (Các '&' nên '& amp;')

<local-tx-datasource> 
    ... 
    <password>smith&wesson</password> 
    ... 
    </local-tx-datasource> 

mong muốn Kết quả

Thay vì 4, tôi sẽ như thế này:

<local-tx-datasource> 
    ... 
    <password>smith&amp;wesson</password> 
    ... 
    </local-tx-datasource> 

bổ sung

Tôi cần phải lo lắng về toàn bộ 'cast charac ters ', tức là nhỏ hơn, lớn hơn, v.v., cũng như dấu và.

Cảm ơn trước

+0

Tôi cũng gặp vấn đề tương tự. Làm thế nào bạn giải quyết của bạn? Bạn đã viết bộ mã hóa tùy chỉnh chưa? Cảm ơn. –

Trả lời

0
JDBC_PASSWORD=smith&amp;wesson 

sẽ cho kết quả:

<local-tx-datasource> 
    <password>smith&amp;wesson</password> 
</local-tx-datasource> 

sẽ được phân tích cú pháp như sau:

<local-tx-datasource> 
    <password>smith&wesson</password> 
</local-tx-datasource> 


JDBC_PASSWORD=smith&amp;amp;wesson 

sẽ cho kết quả:

<local-tx-datasource> 
    <password>smith&amp;amp;wesson</password> 
</local-tx-datasource> 

sẽ được phân tích cú pháp như sau:

<local-tx-datasource> 
    <password>smith&amp;wesson</password> 
</local-tx-datasource> 

tương tự:

less-than : &lt;

greater-than : &gt;

0

Bạn có thể sử dụng các nhiệm vụ Ant-contrib URLEncode (Vâng, nó nói Foreach trên tiêu đề, nhưng đó là chỉ để ném nhiệt ra khỏi đường mòn.).

Bạn có thể sử dụng để đảm bảo rằng mọi giá trị bạn đang chuyển qua <filterset/> tới tệp XML được mã hóa được định dạng chính xác.

Bạn sẽ phải xác định <taskdef/> cho các tác vụ Ant-Contrib và bao gồm jar Ant Contrib.

+0

Mã hóa URL khác với mã hóa XML. Đây là hướng đi đúng, tôi tin là người ta cần một bộ mã hóa tùy chỉnh. – user331465

0

Nếu bạn không thay thế giá trị thuộc tính, bạn luôn có thể sử dụng mục CDATA thay thế. Dấu gạch ngang, ít hơn, vv trong CDATA không cần phải là thực thể được thoát.

<local-tx-datasource> 
    ... 
    <password><![CDATA[@[email protected]]]></password> 
    ... 
</local-tx-datasource> 
Các vấn đề liên quan