【问题标题】:java Map to XML through XSDjava通过XSD映射到XML
【发布时间】:2012-03-05 21:10:15
【问题描述】:

首先。抱歉英语不好。
我想以这种方式根据给定的 XSD 将 Map 进行一些“通用”转换为 XML:

  • Map 的键将等于 XML 中的标记名称
  • XML 中的标签名称不会在不同节点(级别)中重复
  • Map 中的值可以包含例如表示节点中可重复标签的 Map 列表
  • 创建的xml必须符合xsd。
  • 等。

所以我正在寻找一种有效的方法来实现这一点。
有没有做过类似任务的人可以帮助我? 任何建议将不胜感激。提前致谢!

附:例子。

Map:  
"fname" : "Asdf"   
"lname" : "Fdsa"
"cars"  : "car" {"car1", "car2", "car3"}

XML:    
<fname>Asdf</fname>
<lname>Fdsa</lname>
<cars>
  <car>car1</car>
  <car>car2</car>
  <car>car3</car>
</cars>

【问题讨论】:

  • 您能写下您想使用的 XML 示例吗?这将有助于准确了解您的要求。
  • 添加了一个简单的例子。创建的 XML 文件将成为某些 Web 服务 (_service) 的数据源。 _service 将获取模板名称和 XML 数据源并返回文档。每个模板都有自己的架构。我该如何实现这些要求?

标签: java xml map xsd


【解决方案1】:

首先,您需要一个根元素。这是 XML 语法的要求。 现在您可以使用 JAXB。定义你的类数据:

@XmlType
public class Data {
    private String fname;
    private String lname;
    private Collection<String> cars;

    // getters
    public String getFname() {
        return fname;
    }
    public String getLname() {
        return lname;
    }
    @XmlElementWrapper(name = "cars")
    @XmlElement(name = "car")
    public String getCars() {
        return cars;
    }


    // setters.....
}

现在您可以创建此类实例的实例,调用所有 setter 来填充数据,然后调用:

JAXBContext ctx = JAXBContext.newInstance("com.yourpackage");
Marshaller m = ctx.createMarshaller();
m.marshal(data, System.out);

您将在 STDOUT 上看到您的数据序列化为 XML。

要解析 XML 回说:

JAXBContext ctx = JAXBContext.newInstance("com.panpwr.api.model.deployment");
Unmarshaller unmarshaller = ctx.createUnmarshaller();
Data data = (Data)unmarshaller.unmarshal(in); // in is the input stream for XML
// now your instance of data is populated from XML

【讨论】:

  • 感谢您的回复!但是,如果我有几个文档模板,它们使用具有不同节点名称、树深度的自己的相似模式怎么办?.. 对于每个新模板,我只想创建 XSD 并使用适当的属性填充 Map,我的方法会将其转换为 XML。 ..
  • 您可以为每个模式创建多个带注释的数据类,也可以使用基于 XML 的映射。我个人更喜欢带有注释的类。但在过去,我使用基于 XML 的 Digester 映射。
  • 非常感谢,亚历克斯!我会尽量按照你的建议去做!
猜你喜欢
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多