【问题标题】:SimpleXML: element with elements list or textSimpleXML:带有元素列表或文本的元素
【发布时间】:2016-12-06 22:55:52
【问题描述】:

我必须解析一个可以是两种类型的 XML 文件:

<property>
    <value>Some text</value>
</property>

<property>
    <value>
        <item id="first_id"/>
        <item id="second_id"/>
        <item id="third_id"/>
    </value>
</property>

如何用 Java 做到这一点?

我创建了一个类:

@Root(strict = false)
public class PropertyValue {
    @ElementList(inline = true, required = false)
    private List<ItemData> items;

    @Text(required = false)
    private String text;
}

ItemDataitem 类。

但这不起作用。 代码给了我一个例外:

org.simpleframework.xml.core.TextException: Text annotation @org.simpleframework.xml.Text(data=false, empty=, required=false) on field 'text' private java.lang.String PropertyValue.text used with elements in class PropertyValue

【问题讨论】:

    标签: java xml parsing xml-parsing simple-framework


    【解决方案1】:

    我是用 ElementList 和 entry 做的

    @ElementList(entry = "item", inline = true)

    无需自定义转换器即可为我工作。 全班:

    @Root(name = "property")
    public class Property {
       @ElementList(entry = "item", inline = true, required = false)
       private List<Item> items;
    
       @Text(required = false)
       private String text;
    }
    

    【讨论】:

      【解决方案2】:

      我解决了这个问题!

      我使用了以下问题答案:Deserializing an XML tag with text AND subtags using Retrofit

      我创建了一个类,可以根据需要转换 XML 文件(对不起我的代码:-():

      public class PropertyValueConverter implements Converter<PropertyValue> {
          @Override
          public PropertyValue read(InputNode node) throws Exception {
              PropertyValue propertyValue = new PropertyValue();
              List<ItemData> propertyValueItems = new ArrayList<>();
              String propertyValueText = "";
      
              InputNode itemNode = node.getNext("item");
              while (itemNode != null) {
                  String itemId = itemNode.getAttribute("id").getValue();
                  ItemData itemData = new ItemData();
                  itemData.setId(itemId);
                  propertyValueItems.add(itemData);
                  itemNode = node.getNext("id");
              }
      
              if (propertyValueItems.size() == 0) {
                  propertyValueText = node.getValue();
              }
      
              propertyValue.setItems(propertyValueItems);
              propertyValue.setText(propertyValueText);
      
              return propertyValue;
          }
      
          @Override
          public void write(OutputNode node, PropertyValue value) throws Exception {
      
          }
      }
      

      然后我改了PropertyValue类:

      @Root(strict = false)
      @Convert(value = PropertyValueConverter.class)
      public class PropertyValue {
          private List<ItemData> items;
      
          private String text;
      
          public List<ItemData> getItems() {
              return items;
          }
      
          public void setItems(List<ItemData> items) {
              this.items = items;
          }
      
          public String getText() {
              return text;
          }
      
          public void setText(String text) {
              this.text = text;
          }
      }
      

      然后我设置 SimpleXml 转换器工厂:

      private static Strategy strategy = new AnnotationStrategy();
      private static Serializer serializer = new Persister(strategy);
      
      private static Retrofit.Builder builder =
              new Retrofit.Builder()
                      .baseUrl(API_BASE_URL)
                      .addConverterFactory(SimpleXmlConverterFactory.create(serializer));
      

      所以,它对我有用。

      【讨论】:

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