首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java编组和UnMarshalling

Java编组和UnMarshalling
EN

Stack Overflow用户
提问于 2011-09-30 03:46:43
回答 2查看 12.3K关注 0票数 6

Employee.xsd

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" jxb:version="1.0" elementFormDefault="qualified">
<xsd:include schemaLocation="Family.xsd"/>
    <xsd:element name="NewFields">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="empFirstName" type="xsd:string" />
                <xsd:element name="empLastName" type="xsd:string" />
                <xsd:element name="family" type="FamilyFields" nillable="true" maxOccurs="unbounded" minOccurs="0"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

Family.xsd

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" jxb:version="1.0" elementFormDefault="qualified">
<xsd:complexType name="FamilyFields">
        <xsd:sequence>
            <xsd:element name="relation" type="xsd:string" />
            <xsd:element name="firstName" type="xsd:string" />
            <xsd:element name="lastName" type="xsd:string"/>
        </xsd:sequence>
</xsd:complexType>  
</xsd:schema>

使用这2种模式的第三方应用程序生成一个xml字符串,类似于-

代码语言:javascript
复制
<NewFields>
    <empFirstName>Kevin</empFirstName>
    <empLastName>Smith</empLastName>
    <family>
        <FamilyFields>
            <relation>self</relation>
            <firstName>New Kevin</firstName>
            <lastName>New Smith</lastName>
        </FamilyFields>
        <FamilyFields>
            <relation>wife</relation>
            <firstName>Jennifer</firstName>
            <lastName>Smith</lastName>
        </FamilyFields>
    </family>
</NewFields>

第二个模式始终是一个固定的模式。

我的要求是解析关系标记,如果关系是"self",我需要用相应字段的empFirstName和lastName覆盖firstName和lastName。

我怎样才能做到这一点?

编辑1: Employee.xsd是动态的,可以是任何东西。但是Family.xsd是静态的,可以从任何其他xsd导入。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-30 05:35:29

概要:(a)映射XML模式文件,(b)取消给定的XML,(c)修改内存中的XML对象,最后(d)将修改后的对象发送到任何您想要的位置。

映射XML架构文件

代码语言:javascript
复制
@XmlRootElement(name = "FamilyFields") public class FamilyFields {

  @XmlElement public String relation;
  @XmlElement public String firstName;
  @XmlElement public String lastName;

  public FamilyFields() {}
}

@XmlRootElement(name = "NewFields") public class NewFields {

  @XmlElement public String empFirstName;
  @XmlElement public String empLastName;
  @XmlElementWrapper(name = "family")
  @XmlElement(name = "FamilyFields")
  public List<FamilyFields> familyFields;

  public NewFields() {}
}

(如果你接受一个建议:,用手做,,__!使用XJC生成JAXB实体几乎从不输出您期望的内容,如果手头没有非常简单的模式文件,则可能会花费时间。)

收购JAXBContextUnmarshallerMarshaller

代码语言:javascript
复制
JAXBContext context = JAXBContext.newInstance(NewFields.class, FamilyFields.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Marshaller marshaller = context.createMarshaller();
// set optional properties
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

处理传入的XML

代码语言:javascript
复制
// the XML content you gave
String xml = ...

StringReader reader = new StringReader(xml);
NewFields newFields = (NewFields) unmarshaller.unmarshal(reader);

// modify the unmarshalled data to your heart's content
newFields.empLastName = ...

// marshal the modified data anywhere you want
marshaller.marshal(newFields, System.out);
票数 5
EN

Stack Overflow用户

发布于 2011-09-30 04:54:56

如果您有一个XSD,那么使用XML数据绑定操作XML是最容易的。使用XSD,您可以创建表示XSD的类java。现在,您可以对java类进行getter和setter,然后输出XML。有许多XML数据绑定解决方案。试试XML bean:

http://xmlbeans.apache.org/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7605734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档