2010-12-10 18 views
11

Tôi hiện đang sử dụng một mảnh XML như sauJava xStream - Bỏ qua thẻ mà không tồn tại trong XML

<Person> 
    <Name>Frank Smith</Name> 
    <Id>100023412</Id> 
    <DOB>12/05/1954</DOB> 
    <LasLogin>01/09/2010</LasLogin> 
    <FavOS>Windows</FavOS>  // Wild card that may occasionally appear 
</Person> 

Những gì tôi đang mắc kẹt với, đang khi sử dụng xStream tôi cần để có thể bỏ qua một số các thẻ xuất hiện (trong trường hợp trên 'FavOS') Các thẻ này có thể không được biết hoặc thay đổi trong tương lai. Có cách nào để Bỏ qua tất cả các thẻ không khớp với những gì hiện được triển khai không?

(Sử dụng xStream 1.3.1)

Trả lời

16

Như nó đã cho tôi hơn 15 phút để tìm câu trả lời này , Tôi nghĩ tôi sẽ đăng nó.

XStream xstream = new XStream(new DomDriver()) { 
      protected MapperWrapper wrapMapper(MapperWrapper next) { 
       return new MapperWrapper(next) { 
        public boolean shouldSerializeMember(Class definedIn, String fieldName) { 
         try { 
          return definedIn != Object.class || realClass(fieldName) != null; 
         } catch(CannotResolveClassException cnrce) { 
          return false; 
         } 
        } 
       }; 
      } 
     }; 

Điều này dường như bỏ qua các mục xml không có trong đối tượng của bạn.

+0

Liệu công việc này nếu bạn không biết tên của lĩnh vực bạn muốn bỏ qua – ziggy

+1

Có nó ..... – markthegrea

0

Từ x-stream FAQ:

Làm thế nào để thỏa thuận với phiên bản mới hơn của các tầng lớp XStream?

  • Nếu trường mới được thêm vào lớp học, hãy loại bỏ một phiên bản cũ sẽ rời khỏi trường chưa được khởi tạo.
  • Nếu một trường bị loại bỏ khỏi lớp, hãy loại bỏ một phiên bản cũ có chứa trường sẽ gây ra một ngoại lệ. Rời khỏi trường tại chỗ nhưng tuyên bố nó là thoáng qua sẽ tránh ngoại lệ, nhưng XStream sẽ không cố gắng deserialize nó.
  • ...
  • thực hiện một mapper tùy chỉnh để bỏ qua các lĩnh vực chưa biết tự động (xem CustomMapperTest.testCanBeUsedToOmitUnexpectedElements nghiệm thu())
+1

cổ vũ, tôi đã có một săn lại và dường như là một vấn đề từ năm 2004. – Qwan

4

Trước hết, cảm ơn bạn đã chia sẻ câu trả lời này. Nó rất hữu ích. Tuy nhiên, mã được đề cập ở trên có vấn đề. Nó không có chú thích @Override, đó là phải sử dụng đoạn mã này. Đây là mã được cập nhật hoạt động:

XStream xstream = new XStream(new StaxDriver()) { 
      @Override 
      protected MapperWrapper wrapMapper(MapperWrapper next) { 
      return new MapperWrapper(next) { 
       @Override 
       public boolean shouldSerializeMember(Class definedIn, 
         String fieldName) { 
       if (definedIn == Object.class) { 
        return false; 
       } 
       return super.shouldSerializeMember(definedIn, fieldName); 
       } 
      }; 
      } 
     }; 
6

XStream 1.4.5 hỗ trợ xử lý các thẻ không được triển khai. Sử dụng ignoreUnknownElements cho các thẻ chưa được triển khai hoặc đã bị xóa và bạn đang xử lý xml cũ. Bạn cũng có thể chỉ định thẻ cụ thể nào bạn muốn bỏ qua.

0

Kể từ XStream khai marshaller 1.4.5 durring nó đủ để sử dụng ignoreEnknownElements() phương pháp:

XStreamMarshaller marshaller = new XStreamMarshaller(); 
marshaller.getXStream().ignoreUnknownElements(); 
... 

để bỏ qua các yếu tố không cần thiết.

0

Tôi đã hỏi chính xác cùng một vấn đề.

How can I make a XStreamMarshaller skip unknown binding?

Và tôi nhận được một nhận xét liên kết bài đăng này.

Tôi đã giải quyết được sự cố của mình bằng cách mở rộng XStreamMarshaller.

public class ExtendedXStreamMarshaller extends XStreamMarshaller { 

    @Override 
    protected void configureXStream(final XStream xstream) { 
     super.configureXStream(xstream); 
     xstream.ignoreUnknownElements(); // will it blend? 
    } 
} 
Các vấn đề liên quan