2012-03-18 39 views
7

Tôi muốn viết một phương thức cho một lớp Java. Phương thức này chấp nhận làm đầu vào một chuỗi dữ liệu XML như được đưa ra dưới đây.Chuỗi thay thế trong chuỗi con

<?xml version="1.0" encoding="UTF-8"?> 
<library> 

    <book> 
     <name> <> Programming in ANSI C <> </name> 
     <author> <> Balaguruswamy <> </author> 
     <comment> <> This comment may contain xml entities such as &, <and>. <> </comment> 
    </book> 

    <book> 
     <name> <> A Mathematical Theory of Communication <> </name> 
     <author> <> Claude E. Shannon <> </author> 
     <comment> <> This comment also may contain xml entities. <> </comment> 
    </book> 

    <!-- This library contains more than ten thousand books. --> 
</library> 

Chuỗi XML chứa nhiều chuỗi con bắt đầu và kết thúc với <>. Các chuỗi có thể chứa các đối tượng XML như >, <, &, '" Phương pháp này cần phải thay thế chúng với & gt;., & lt;, & amp ;. & apos;& quot; tương ứng.

Có phương thức biểu thức chính quy nào trong Java để thực hiện tác vụ này không?

+0

Bạn có yêu cầu thoát khỏi tất cả XML, hoặc chỉ <> điều đó xảy ra ở giữa các thẻ? –

+0

Không phải tất cả XML nhưng ở giữa. –

+1

Ai đang tạo XML? Có vẻ như cách khắc phục vấn đề chính xác sẽ là xuất xml hợp lệ thay vì tinkering với nội dung. – pimaster

Trả lời

3

Dữ liệu này có được chuyển cho bạn hay bạn có thể kiểm soát dữ liệu không? Nếu có, thì tôi khuyên bạn nên sử dụng khối CDATA. Nếu bạn thực sự không chắc chắn về dữ liệu được nhập vào khối xml, thì chỉ cần bọc mọi thứ trong CDATA trước khi được lưu vào DB

Nếu bạn không có quyền kiểm soát này, thì theo như tôi biết, điều này sẽ có số lượng mã hóa hợp lý do số lượng các trường hợp cạnh mà bạn có thể phải xử lý. Không phải cái gì mà một regex đơn giản sẽ có thể giải quyết được (nếu một khối hợp lệ đang bắt đầu, nếu một cái kết thúc, nếu một cái đã kết thúc, vv)

Đây là một quy trình rất cơ bản cho trường hợp <> phần còn lại tôi thực sự tin rằng chỉ nhận được vô cùng phức tạp

\<\>* //For <> changes 
+0

Wow! Tôi nghĩ đó là một ý tưởng mới đối với tôi. Đây không phải là những gì tôi cố gắng làm theo. Tôi nghĩ rằng nó sẽ làm việc cho tôi. Tôi nên thay thế tất cả "<>" trước chuỗi con bằng "" sau chuỗi con "]]>", phải không? –

+0

Xin lỗi vì xóa trước đó, tôi đã bị phân tâm và đọc nhầm nhận xét của bạn, vì vậy tôi đã tìm ra câu trả lời của mình sau này. Tôi đã cập nhật nó và sẽ cung cấp cho một số regexes hợp lệ ngay :) Nhưng, nếu bạn có thể lưu dữ liệu với các khối CDATA, điều đó sẽ làm cho cuộc sống dễ dàng hơn: D –

+0

1 để giới thiệu CDATA, nó có vẻ giống như cách tiếp cận đúng. – anubhava

2

Bạn có thể làm theo an example

  1. đọc một tập tin XML bằng cách Dom hoặc SAX
  2. chuỗi thay thế bởi biểu hiện thường xuyên
  3. Viết tệp XML theo Dom hoặc SAX
+0

Vì chuỗi con chứa các thực thể XML, đọc Dom sẽ thất bại, phải không? –

+0

Tôi không chắc chắn; hãy thử nó và cho tôi biết kết quả. Cảm ơn – punny

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