【问题标题】:SimpleXML parsing not working with @ElementListSimpleXML 解析不适​​用于 @ElementList
【发布时间】:2017-08-24 17:22:00
【问题描述】:

我在这个解析上苦苦挣扎了几个小时,所以我想也许你会有见解。 我得到了这个 XML 结构:

<ItemSearchResponse>
     <OperationRequest>...</OperationRequest>
     <Items>
         <Request>
              <IsValid>true</IsValid>
         </Request>
         <TotalPages>16</TotalPages>
         <Item>
              <DetailPageURL>http://....</DetailPageURL>
         </Item>
          <Item>....</Item>
           ...
           <Item>....</Item>
     </Items>
</ItemSearchResponse>

我的课程是:

Root(strict=false)
public class ItemSearchResponse {

    @ElementList
    List<Item> Items;
}

和:

@Root
public class Item {
    @Element(name="DetailPageURL", required = false)
    private String url;
}

当我运行以下代码时:

InputStream is = ... // stream from xml;
Serializer serializer = new Persister();
ItemSearchResponse response = serializer.read(ItemSearchResponse.class, is);

我得到以下异常:

org.simpleframework.xml.core.ElementException: Element 'IsValid' does not have a match in class club.mymedia.shoppingadvisor.amazon.xml.Item at line 1

似乎&lt;Item&gt; 的解析不起作用,而是解析了&lt;Request&gt;。 我应该改变什么才能让它工作?

【问题讨论】:

    标签: java xml parsing exception simple-framework


    【解决方案1】:

    这样试试

    import java.io.InputStream;
    import java.util.List;
    import org.simpleframework.xml.Element;
    import org.simpleframework.xml.ElementList;
    import org.simpleframework.xml.Root;
    import org.simpleframework.xml.Serializer;
    import org.simpleframework.xml.core.Persister;
    
    class Main {
    
        public static void main(String[] args) throws Exception {
            Serializer serializer = new Persister();
            InputStream source = ClassLoader.getSystemResourceAsStream("myxml.xml");
            ItemSearchResponse itemSearchResponse = serializer.read(ItemSearchResponse.class, source);
        }
    }
    
    @Root
    class ItemSearchResponse {
        @Element(name = "Items")
        Items items;
    
        @Element(name = "OperationRequest")
        String operationRequest;
    }
    
    class Items {
    
        @Element(name = "Request")
        Request request;
    
        @Element(name = "TotalPages")
        int totalPages;
    
        @ElementList(inline = true, name = "Item")
        List<Item> itemList;
    }
    
    class Request {
    
        @Element(name = "IsValid")
        boolean isValid;
    }
    
    @Root(name = "Item")
    class Item {
    
        @Element(name = "DetailPageURL", required = false)
        String url;
    }
    

    不要忘记 java 命名约定,变量以小写开头,变量名也不应以下划线 _ 或美元符号 $ 字符开头。

    还可以考虑根据 OOP 原则将字段设为私有并使用 getter 进行适当封装(只是说,不确定是否这样做)

    【讨论】:

    • 问题是我有很多 标签...我需要它们的列表。
    • 希望对您有所帮助:-)
    • 像魅力一样工作!你能解释一下:1.为什么你在类Item中添加了'name'属性。 2. 为什么itemList标有属性'inline'?
    • 很高兴听到 :) name 属性表示 XML 元素的名称,而 inline 表示元素不包含在任何父元素中。请注意,它们需要一个接一个地放置
    • 我用另一种没有 inline = true 的方式更新了我的答案
    猜你喜欢
    • 2013-08-19
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多