首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用嵌套的泛型标记绑定Java XML

用嵌套的泛型标记绑定Java XML
EN

Stack Overflow用户
提问于 2012-09-21 17:18:32
回答 1查看 195关注 0票数 0

我需要一种在Java中将XML转换为有意义的域对象的有效方法。下面是我必须使用的XML的选择(有些值已经模糊了)。下面是我必须处理的基本限制:

  1. 没有可以使用的架构。自动生成的模式结果并不好,因为变量“嵌套”。
  2. 任何给定的域对象都可以包含0-*域对象标记。
  3. 任何给定的域对象都可以包含0-*值标记。
  4. 并非所有嵌套都是平等创建的。在某些情况下,值的“键”包括隐式嵌套。例如,"config.cbs“表示配置对象的集合,每个对象具有不同的.cbs值。
  5. 更改XML结构可能是不可能的。
  6. “表示”属性表示类型。
  7. "nestedKey“属性表示类型中的变量名。
  8. 这些XML文件可能相当大。

我尝试过使用JAXB,但是由于标签的“泛型性”,事情并没有得到解决。也许我的JAXB-fu是不够的。当前的实现(我继承了这个)是SAX,但实际上不起作用。我看过XStream,但它似乎假定了标记的一些语义结构。

我想要一种代码最少、最灵活、最可扩展的方法来生成有意义的域对象.如果可能的话,我希望避免嵌套HashMaps (这是当前解决方案中无法工作的一部分)。创意,黑客,或聪明的想法是受欢迎的,以及前进的“杜赫”的答案。

XML片段:

代码语言:javascript
复制
<?xml version="1.0"?>
<domain-objects>
    <types language="C++">
        <type prefix="bool" language-representation="bool" />
        <type prefix="char" language-representation="char" />
        <type prefix="domain_object" language-representation="opti::DomainObject" />
        <type prefix="domain_object" language-representation="DomainObject" />
        <type prefix="double" language-representation="double" />
        <type prefix="float" language-representation="float" />
...
    </types>
    <domain-object key="(unique object id)" represents="PerfSuite">
        <domain-object key="(unique object id)" nestedKey="testCore" represents="PerfTestCore">
            <value key="suiteUuid" type="stl_string">(unique object id)</value>
            <value key="suiteName" type="stl_string">(some name)</value>
            <value key="suiteId" type="int">(some number)</value>
            <value key="suiteDeleted" type="bool">false</value>
        </domain-object>
        <domain-object key="(unique object id)" nestedKey="testResults" represents="PerfTestResults">
            <domain-object key="(unique object id)" nestedKey="services_0" represents="PerfServiceResult">
                <domain-object key="(unique object id)" nestedKey="stepResults_0" represents="PerfStepResult">
                    <value key="ir.max" type="int64">(some number)</value>
                    <value key="ftd.avg" type="float">(some number)</value>
                    <value key="ftd.max" type="float">(some number)</value>
...
                </domain-object>
                <value key="duration" type="uint">(some number)</value>
                <value key="flow" type="uint16">(some number)</value>
...
                        <value key="config[1].flrThreshold" type="float">(some number)</value>
                        <value key="config[1].fdvPercent" type="float">(some number)</value>
                        <value key="index" type="uint16">(some number)</value>
                        <value key="config[0].cbs" type="uint64">(some number)</value>
                        <value key="svlanVid" type="uint16">(some number)</value>
                        <value key="config[1].availThreshold" type="float">(some number)</value>
...
EN

回答 1

Stack Overflow用户

发布于 2012-09-21 17:56:02

没有一个工具能完全解决这个问题。

JAXB可能仍然是解析部分的正确答案。如果您希望将每个域对象转换为实际的域对象,则必须自己完成最后的传递。

JAXB将无法解析出" float“,以确定它需要查找type表才能找到要浮动的浮动映射。在对象中查找“config1.fdvPerse”也超出了它的能力范围。

据我所见,您有一个相当一致的文档结构,可以由模式来描述。用XML模式或注释类编写这类应该很简单。

代码语言:javascript
复制
domain-objects = types+, domain-object+
domain-object = domain-object*, value*

从这里开始,你的工作就交给你了。我怀疑你会需要很多东西:

  • 对每个元素中的字符串进行每种类型的解析,这样就可以获得每个元素的值。
  • 从类型的字符串值到每种类型的解析器的映射(看起来您可能需要额外的映射步骤才能从C++?(使用Java类型)
  • 值键的解析器,以便您可以找到要将值应用到的变量。
  • 在创建的对象中实例化对象和设置值的一些反射

我猜不出nestedKey或代表对你意味着什么。这些可能需要额外的步骤。

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

https://stackoverflow.com/questions/12535162

复制
相关文章

相似问题

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