SimpleXML:带有元素列表或文本的元素
SimpleXML: element with elements list or text
我必须解析一个 XML 文件,它可以是两种类型:
<property>
<value>Some text</value>
</property>
和
<property>
<value>
<item id="first_id"/>
<item id="second_id"/>
<item id="third_id"/>
</value>
</property>
如何使用 Java 执行此操作?
我创建了一个 class:
@Root(strict = false)
public class PropertyValue {
@ElementList(inline = true, required = false)
private List<ItemData> items;
@Text(required = false)
private String text;
}
ItemData
是 item
class.
但这不起作用。
代码给了我一个例外:
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
我解决了问题!
我使用了以下问题答案:
我创建了一个 class 可以根据需要转换 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
class:
@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));
所以,它对我有用。
我是用 ElementList 和 entry 做的
@ElementList(entry = "item", inline = true)
无需自定义转换器即可为我工作。
完整 class:
@Root(name = "property")
public class Property {
@ElementList(entry = "item", inline = true, required = false)
private List<Item> items;
@Text(required = false)
private String text;
}
我必须解析一个 XML 文件,它可以是两种类型:
<property>
<value>Some text</value>
</property>
和
<property>
<value>
<item id="first_id"/>
<item id="second_id"/>
<item id="third_id"/>
</value>
</property>
如何使用 Java 执行此操作?
我创建了一个 class:
@Root(strict = false)
public class PropertyValue {
@ElementList(inline = true, required = false)
private List<ItemData> items;
@Text(required = false)
private String text;
}
ItemData
是 item
class.
但这不起作用。 代码给了我一个例外:
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
我解决了问题!
我使用了以下问题答案:
我创建了一个 class 可以根据需要转换 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
class:
@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));
所以,它对我有用。
我是用 ElementList 和 entry 做的
@ElementList(entry = "item", inline = true)
无需自定义转换器即可为我工作。 完整 class:
@Root(name = "property")
public class Property {
@ElementList(entry = "item", inline = true, required = false)
private List<Item> items;
@Text(required = false)
private String text;
}