2

I have xml like this

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

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

Can xstream handle these namespaces like 'abc' in <abc:city>

Also namespace for <pqr:postalTown> can be changed as I am unaware of the response coming. How can this be handled dynamically through xstream.

If this is impossible in xstream; can it be handled using jaxb?

EDIT: My class will be City:

Class City{
String cityName;
String postalTown;
}

How can I map above xml to City class as tags contain prefixes?

4

1 回答 1

3

更新

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


关于命名空间资格的说明

所使用的前缀在对象到 XML 的映射中不起作用。只要 thexyzpqr前缀对应于相同的命名空间,您就可以使用任何支持命名空间的对象到 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 和命名空间

下面是如何将您的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 和命名空间的一些信息:


演示代码

以下演示代码可用于解组我之前在此答案中发布的任何一个 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>
于 2012-08-13T11:22:39.057 回答