Java SimpleXML:对多个类型使用id属性
我正在使用SimpleXML将XML解析为Java对象,但无法解析此文件:Java SimpleXML:对多个类型使用id属性,java,xml,simple-framework,Java,Xml,Simple Framework,我正在使用SimpleXML将XML解析为Java对象,但无法解析此文件: 使用此Java类: @默认值 @Root(name=“pets”) 公共类SimpleIds { @ElementList(必需=false) 公猫; @ElementList(必需=false) 公犬; @Root(name=“cat”) 公共静态类Cat { @属性 公开弦乐谈话; 公众闲谈 { System.out.println(talk); } } @Root(name=“dog”) 公共静态类狗 { }
使用此Java类:
@默认值
@Root(name=“pets”)
公共类SimpleIds
{
@ElementList(必需=false)
公猫;
@ElementList(必需=false)
公犬;
@Root(name=“cat”)
公共静态类Cat
{
@属性
公开弦乐谈话;
公众闲谈
{
System.out.println(talk);
}
}
@Root(name=“dog”)
公共静态类狗
{
}
@元素
公共矿山;
@Root(name=“mine”)
公共静态级矿井
{
@元素
公猫;
}
}
这个序列化程序:
Strategy strategy = new CycleStrategy("id", "ref");
Serializer serializer = new Persister(strategy);
SimpleIds xml = serializer.read(SimpleIds.class, new File("simpleIds.xml"));
xml.mine.cat.talk();
这让我很不高兴:
org.simpleframework.xml.strategy.CycleException: Element '0' already exists
在SimpleXML中使用这种xml文件是不可能的吗?或者它只是一种糟糕的xml格式
编辑:如果我将
cat id=“0”
更改为cat id=“2”
,它就像一个符咒一样工作…在CycleStrategy的构造函数中,您可以传入参数以指定是否使用“id”作为属性来标识元素或其他内容。这里产生异常是因为它注意到两个元素具有相同的“id”。试试这个
CycleStrategy s = new CyctleStragegy("myid", "myreference")
它会工作的。您的XML非常完美。我不知道简单框架,但我已经使用JAXB了 如果有帮助的话,我已经使用了JAXB 这是一个完美的例子
@XmlRootElement(name ="cat")
@XmlAccessorType(XmlAccessType.FIELD)
public class Cat {
private String catName;
private int id;
Getters And Setters
}
@XmlRootElement(name ="dog")
@XmlAccessorType(XmlAccessType.FIELD)
public class Dog {
private String dogName;
private int id;
Getters And Setters
}
@XmlRootElement(name = "cats")
@XmlAccessorType(XmlAccessType.FIELD)
public class Cats {
@XmlElement(name = "cat")
private List<Cat> cats;
Getters And Setters
}
@XmlRootElement(name = "dogs")
@XmlAccessorType(XmlAccessType.FIELD)
public class Dogs {
@XmlElement(name = "dog")
private List<Dog> dogs;
Getters And Setters
}
@XmlRootElement(name ="pets")
@XmlAccessorType(XmlAccessType.FIELD)
public class Pet {
@XmlElement
private Dogs dogs;
@XmlElement
private Cats cats;
Getters And Setters
}
@XmlRootElement(name=“cat”)
@XmlAccessorType(XmlAccessType.FIELD)
公猫{
私有字符串catName;
私有int-id;
接球手和接球手
}
@XmlRootElement(name=“dog”)
@XmlAccessorType(XmlAccessType.FIELD)
公家犬{
私有字符串dogName;
私有int-id;
接球手和接球手
}
@XmlRootElement(name=“cats”)
@XmlAccessorType(XmlAccessType.FIELD)
公猫{
@xmlement(name=“cat”)
私人名单猫;
接球手和接球手
}
@XmlRootElement(name=“dogs”)
@XmlAccessorType(XmlAccessType.FIELD)
公家犬{
@xmlement(name=“dog”)
私人名单狗只;
接球手和接球手
}
@XmlRootElement(name=“pets”)
@XmlAccessorType(XmlAccessType.FIELD)
公营宠物{
@XmlElement
私家狗;
@XmlElement
私人猫;
接球手和接球手
}
我已经测试过了,请测试一下 最后我在以下方面找到了答案: 文档中类型为“ID”(包括所有xml:ID属性)的所有属性的值都是唯一的 这意味着我的输入XML不正确 我无法更改它,因为我从软件接收到它,但我必须在读取它之前格式化它(并反向写入),以获得如下内容:
编辑:以下代码可以在SimpleXML中为您自动完成这些工作:
/*
*版权所有(C)2014,Mathieu Lavigne
*
*根据Apache许可证2.0版(以下简称“许可证”)获得许可;
*除非遵守许可证,否则不得使用此文件。
*您可以通过以下方式获得许可证副本:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*除非适用法律要求或书面同意,软件
*根据许可证进行的分发是按“原样”进行分发的,
*没有任何形式的保证或条件,无论是明示的还是明示的
*暗示。请参阅特定语言的许可证
*许可证下的权限和限制。
*/
包org.simpleframework.xml.strategy;
导入静态org.simpleframework.xml.strategy.Name.*;
导入java.util.Map;
导入org.simpleframework.xml.core.Persister;
导入org.simpleframework.xml.stream.Node;
导入org.simpleframework.xml.stream.NodeMap;
/**
*SimpleXML的CycleStragey允许在不同类型的节点上具有重复ID。
*
*已知的限制:
*
*
*- 对于遗留CycleStragey,在调用{@link Persister#write(Object,java.io.File)}时,会为每个节点生成新的ID
*
*
*@作者bludwarf@gmail.com
*@自2014年6月26日起
*/
公共类TypedCycleTegy扩展了CycleTegy
{
私有字符串标记;
私有字符串引用;
公共类型循环策略()
{
这(标记、参考、标签、长度);
}
公共类型循环策略(字符串标记,字符串引用)
{
这(标记、参考、标签、长度);
}
公共类型循环策略(字符串标记、字符串引用、字符串标签)
{
这(标记、参考、标签、长度);
}
公共类型循环策略(字符串标记、字符串引用、字符串标签、字符串长度)
{
超级(标记、参考、标签、长度);
这个。马克=马克;
this.refere=参考;
}
读取公共值(类型、节点映射节点、映射映射)
抛出异常
{
//唯一id
makeUniqueAttribute(标记、节点、类型);
//唯一引用
makeUniqueAttribute(引用、节点、类型);
返回super.read(类型、节点、映射);
}
/**
*@param属性标记或引用
*@param node当前节点
*@param-type节点类型
*@返回创建的唯一ID
*@抛出异常
*/
公共静态字符串makeUniqueAttribute(字符串属性、节点映射节点、类型类型)引发异常
{
最终节点条目=Node.remove(属性);
字符串uniqueId=null;
//找到属性了吗?
if(条目!=null)
{
//替换它以使其独特
最终字符串id=entry.getValue();
uniqueId=type.getType().getName()+“-”+id;
node.put(属性,uniqueId);
}
返回唯一标识;
}
}
注意:请勿更改包声明强>
及