xml java jaxb_java-使用JAXB根据属性解析xml

注意:我是EclipseLink JAXB (MOXy)主管,并且是JAXB (JSR-222)专家组的成员

以下是处理此用例的两种方法.首先是更多代码,但是可以用任何JAXB实现来完成.第二个是更少的代码,但是需要您使用EclipseLink JAXB(MOXy).

选项#1-任何JAXB(JSR-222)的实现

演示版

您可以使用过滤后的流读取器来过滤掉不需要的元素,并使JAXB实现取消编组.

package forum11586106;

import javax.xml.bind.*;

import javax.xml.stream.*;

import javax.xml.transform.stream.StreamSource;

public class Demo {

private static final String LANGUAGE_CODE = "en";

public static void main(String[] args) throws Exception {

XMLInputFactory xif = XMLInputFactory.newFactory();

XMLStreamReader xsr = xif.createXMLStreamReader(new StreamSource("src/forum11586106/input.xml"));

xsr = xif.createFilteredReader(xsr, new StreamFilter() {

private boolean isReading = true;

@Override

public boolean accept(XMLStreamReader reader) {

if(reader.isStartElement() && "Name".equals(reader.getLocalName())) {

isReading = LANGUAGE_CODE.equals(reader.getAttributeValue("", "language"));

return isReading;

} else if(reader.isEndElement() && !isReading) {

isReading = true;

return false;

}

return true;

}});

JAXBContext jc = JAXBContext.newInstance(Countries.class);

Unmarshaller unmarshaller = jc.createUnmarshaller();

Countries countries = (Countries) unmarshaller.unmarshal(xsr);

Marshaller marshaller = jc.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

marshaller.marshal(countries, System.out);

}

}

国别

package forum11586106;

import javax.xml.bind.annotation.*;

@XmlRootElement

public class Countries {

private String name;

@XmlElement(name="Name")

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

input.xml

使用这种方法,输出中不包括language属性:

Australia

Australien

输出量

Australia

选项#2-ECLIPSELINK JAXB(MOXy)

国别

package forum11586106;

import javax.xml.bind.annotation.*;

import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement

public class Countries {

private String name;

@XmlPath("Name[@language='en']/text()")

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

jaxb.properties

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

演示版

通过这种方法,元素过滤由@XmlPath映射处理,因此运行时部分变得更加简单.注意如何仅使用标准的JAXB运行时API.

package forum11586106;

import java.io.File;

import javax.xml.bind.*;

public class Demo {

public static void main(String[] args) throws Exception {

JAXBContext jc = JAXBContext.newInstance(Countries.class);

Unmarshaller unmarshaller = jc.createUnmarshaller();

File xml = new File("src/forum11586106/input.xml");

Countries countries = (Countries) unmarshaller.unmarshal(xml);

Marshaller marshaller = jc.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

marshaller.marshal(countries, System.out);

}

}

input.xml

Australia

Australien

输出量

使用这种方法,输出中将包含language属性:

Australia

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值