Xstream或Jaxb架构支持

时间:2012-08-13 10:24:17

标签: java xml jaxb xstream

我有像这样的xml

<abc:city>
  <def:cityname />
  <xyz:postalTown>
     Sacramento
  </xyz:postalTown>
</abc:city>

<abc:city>
  <def:cityname />
  <pqr:postalTown>
     Sacramento
  </pqr:postalTown>
</abc:city>

xstream可以在<abc:city>

中处理这些名称空间,例如'abc'

<pqr:postalTown>的命名空间也可以更改,因为我不知道响应即将发生。如何通过xstream动态处理。

如果在xstream中这是不可能的;可以使用jaxb处理吗?

编辑: 我的班级将是城市:

Class City{
String cityName;
String postalTown;
}

如何将xml上方映射到 City 类,因为标签包含前缀?

1 个答案:

答案 0 :(得分:3)

<强>更新

如果前缀与命名空间声明不对应,那么您可以使用我在下面从相关问题链接的答案中的方法:


关于NAMESPACE资格的说明

使用的前缀在对象到XML映射方面没有发挥作用。只要xyzpqr前缀对应于相同的命名空间,您就可以使用支持命名空间的任何对象到XML解决方案。

即使以下文档包含不同的前缀,它们也具有相同的命名空间限定。

文件#1

<abc:city xmlns:abc="ABC" xmlns:def="DEF" xmlns:ghi="XYZ">
    <def:cityName/>
    <ghi:postalTown>
        Sacramento
    </ghi:postalTown>
</abc:city>

文件#2

<jkl:city xmlns:jkl="ABC" xmlns:mno="DEF" xmlns:pqr="XYZ">
    <mno:cityName/>
    <pqr:postalTown>
        Sacramento
    </pqr:postalTown>
</jkl:city>

JAXB和NAMESPACES

以下是将City类映射到上述XML文档的方法。请注意它是如何命名空间URI而不是@XmlRootElement@XmlElement注释中指定的前缀。

package forum11932402;

import javax.xml.bind.annotation.*;

@XmlRootElement(namespace="ABC")
public class City {

    @XmlElement(namespace="DEF")
    String cityName;

    @XmlElement(namespace="XYZ")
    String postalTown;

}

以下是有关JAXB和命名空间的一些信息:


DEMO CODE

以下演示代码可用于解组我在本答案前面发布的任何XML文档。

package forum11932402;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum11932402/input.xml");
        City city = (City) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(city, System.out);
    }

}

以下是运行演示代码的输出。 JAXB实现已分配新前缀。 cityName元素仍然是名称空间限定的,它只对应于声明为xmls="DEF"的默认名称空间。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns3:city xmlns="DEF" xmlns:ns2="XYZ" xmlns:ns3="ABC">
    <cityName></cityName>
    <ns2:postalTown>
        Sacramento
    </ns2:postalTown>
</ns3:city>