当前位置: 首页 > 面试题库 >

文件中未编组对象的JAXB位置

殷安顺
2023-03-14
问题内容

我有一些对象被JAXB从XML文件中解组。JAXB可以告诉我还是以某种方式找出每个对象来自XML文件(行和列)的位置?

该信息有时可用,因为JAXB在模式验证错误期间将其提供给我。但我也想将其用于经过验证的对象。


问题答案:

您可以在JAXB中利用an XMLStreamReader和an 来做到这一点Unmarshaller.Listener

演示版

package forum383861;

import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.Unmarshaller.Listener;
import javax.xml.stream.Location;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Customer.class);


        XMLInputFactory xif = XMLInputFactory.newFactory();
        FileInputStream xml = new FileInputStream("src/forum383861/input.xml");
        XMLStreamReader xsr = xif.createXMLStreamReader(xml);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        LocationListener ll = new LocationListener(xsr);
        unmarshaller.setListener(ll);

        Customer customer = (Customer) unmarshaller.unmarshal(xsr);
        System.out.println(ll.getLocation(customer));
        System.out.println(ll.getLocation(customer.getAddress()));
    }

    private static class LocationListener extends Listener {

        private XMLStreamReader xsr;
        private Map<Object, Location> locations;

        public LocationListener(XMLStreamReader xsr) {
            this.xsr = xsr;
            this.locations = new HashMap<Object, Location>();
        }

        @Override
        public void beforeUnmarshal(Object target, Object parent) {
            locations.put(target, xsr.getLocation());
        }

        public Location getLocation(Object o) {
            return locations.get(o);
        }

    }

}

input.xml

<?xml version="1.0" encoding="UTF-8"?>
<customer>
    <address/>
</customer>

输出量

[row,col {unknown-source}]: [2,1]
[row,col {unknown-source}]: [3,5]

顾客

package forum383861;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Customer {

    private Address address;

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

}

地址

package forum383861;

public class Address {

}

想要查询更多的信息

  • http://blog.bdoughan.com/2011/08/using-unmarshallerlistener-to-capture.html


 类似资料:
  • 在我的项目中,我遇到了一种情况,即封送一个pojo对象,第一次将输出写入XMLfile中,然后在同一个文件中添加具有不同值但相同节点和子节点的相同封送对象。下面是代码- 当Person构造函数中的'id'发生更改,并且下次用不同的属性值封送Person对象时,'file.xml'文件将被覆盖,我丢失了以前的输出。简单地说,我希望每次“id”get发生更改时都追加封送的Person对象。即用不同的值

  • 问题内容: 这给了我一个Document对象,它的顶层节点没有子节点: 这是变通方法,似乎效率更高,因为它先转换为String,然后转换为Document。 是否有可能完成我要完成的工作? 问题答案: 你在做什么应该工作。这是一个例子: 领域模型(Foo) 演示版 输出量

  • 我试图使用注释将JSON数据转换为XML。我的有点像这样: 我想使用封送来创建看起来如下所示的XML:(请注意标记,它在中没有,但我需要在中添加) 我有以下几门课: 我的main类实际上会读取JSON数据并将其封送为XML。我使用Jackson读取JSON数据,为了简单起见,我删除了这些代码: 以下是我的类: 以下是我创建的类,它作为标记将不会出现在传入的JSON中,但我需要在封送处理期间将其添加

  • 问题内容: 我们正在整理来自http://xmlgw.companieshouse.gov.uk/的回复。这是发送给马歇尔的文本: CoSearchItem的模型如下: NameSearch模型具有以下结构: 该软件包具有以下注释: 解组从第一完成提取从一个更大的,内部的产品清单。但是,当我们解析xml时,CoSearchItem中的所有字段都设置为null,无法找出原因。 问题答案: 您需要使用

  • 我有 和Xlink类,该类在内联变量中工作良好。 对于的XML输入 并且子课程拒绝被取消注册(没有任何异常被抛出)。 注:不幸的是,MOXy不是一个选项。 编辑:新编组对象 Edit2:在对测试对象进行了一些解组和编组的实验之后,我发现我需要在内容的标题中定义xmlns名称空间,以便与类似问题在于,我从一个包装类中获取Course元素,该包装类由resteasy解析出来。因此,生成的类不会携带名称

  • 当在testng单元testcase中运行时,JAXB将XML文件解组到对象中工作正常。 当相同的代码被用来在另一个进程中解封相同的XML文件时,我得到了一个空对象。我可以验证对象是为XML文档中的每个元素创建的,并且所有适配器都被调用。在unmarshaller中设置事件处理程序,但没有验证问题。当我设置xmlns属性和前缀时,即使返回空对象,行为也略有不同。 我看了好几篇文章,但都无法与我面临