【问题标题】:Java XStream - Ignore tag that doesn't exist in XMLJava XStream - 忽略 XML 中不存在的标记
【发布时间】:2010-12-10 14:24:09
【问题描述】:

我目前使用如下的一段 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>

我坚持的是,当使用 XStream 时,我需要能够忽略出现的某些标签(在上面的“FavOS”的情况下) 这些标签将来可能不为人所知或更改。有没有办法忽略所有与当前实现的标签不匹配的标签?

(使用 XStream 1.3.1)

【问题讨论】:

    标签: java xstream


    【解决方案1】:

    因为我花了 15 多分钟才找到这个答案,所以我想我会发布它。

    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;
                            }
                        }
                    };
                }
            };
    

    这似乎跳过了不在您的对象中的 xml 项目。

    【讨论】:

    • 如果您不知道要忽略的字段的名称,这是否有效
    【解决方案2】:

    XStream 1.4.5 支持处理未实现的标签。使用ignoreUnknownElements 标记尚未实现或已被删除并且您正在处理旧xml。您还可以指定要忽略的特定标签。

    【讨论】:

      【解决方案3】:

      首先,感谢您分享这个答案。这非常有用。但是,上面提到的代码有问题。它没有 @Override 注释,这是使用这段代码所必须的。这是有效的更新代码:

          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);
                    }
                  };
                }
              };
      

      【讨论】:

        【解决方案4】:

        来自x-stream FAQ

        XStream 如何处理更新的 类的版本?

        • 如果向类中添加了新字段,则反序列化旧版本 将使该字段保持未初始化状态。
        • 如果从类中删除一个字段,反序列化包含该字段的旧版本将导致异常。保留该字段但将其声明为瞬态将避免异常,但 XStream 不会尝试反序列化它。
        • ...
        • 实现自定义映射器以自动忽略未知字段(请参阅验收测试 CustomMapperTest.testCanBeUsedToOmitUnexpectedElements())

        【讨论】:

        • 干杯,我确实四处打猎,自 2004 年以来似乎一直是个问题。
        【解决方案5】:

        由于 XStream 1.4.5 在编组器声明期间使用 ignoreEnknownElements() 方法就足够了:

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

        忽略不必要的元素。

        【讨论】:

          【解决方案6】:

          我问的是完全相同的问题。

          How can I make a XStreamMarshaller skip unknown binding?

          我收到一条评论链接这篇文章。

          我通过扩展 XStreamMarshaller 解决了我的问题。

          public class ExtendedXStreamMarshaller extends XStreamMarshaller {
          
              @Override
              protected void configureXStream(final XStream xstream) {
                  super.configureXStream(xstream);
                  xstream.ignoreUnknownElements(); // will it blend?
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多