Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SimpleXML:对多个类型使用id属性_Java_Xml_Simple Framework - Fatal编程技术网

Java SimpleXML:对多个类型使用id属性

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”) 公共静态类狗 { }

我正在使用SimpleXML将XML解析为Java对象,但无法解析此文件:


使用此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); } 返回唯一标识; } }
注意:请勿更改包声明