当前位置: 首页 > 知识库问答 >
问题:

使用eclipselink MOXy的XmlPath映射问题

佟高澹
2023-03-14

我不明白为什么我在下面所做的XmlPath映射会显示为NULL。我的语法有问题吗?我在别处使用了类似的语法,没有问题。

谢谢你提供的线索..约翰

<clip lane="-1" offset="2591065664/720000s" name="Music" duration="22304160/240000s" start="176794/48000s" enabled="0" format="r5">
    <adjust-volume amount="1dB">
      <param name="amount">
        <fadeIn type="easeIn" duration="1220/262144s"/>
      </param>
    </adjust-volume>
    <audio ref="r9" name="VoiceOver-26 - audio" duration="4639346/48000s" role="dialogue"/>
</clip>

@XmlRootElement(name = "clip")
@XmlAccessorType(XmlAccessType.FIELD)
public class Clip extends StoryElement {

@XmlPath("adjust-volume/@amount")
@XmlJavaTypeAdapter(DecibelValueAdapter.class)
private Double adjustVolume;

@XmlPath("adjust-volume/param[@name='amount']/fadeIn/@duration")
@XmlJavaTypeAdapter(TimeValueAdapter.class)
private TimeValue fadeIn;

@XmlPath("adjust-volume/param[@name='amount']/fadeOut/@duration")
@XmlJavaTypeAdapter(TimeValueAdapter.class)
private TimeValue fadeOut;

共有1个答案

米俊喆
2023-03-14

我无法再现您在使用Eclipselink2.4.0时看到的问题。下面是我尝试过的。

夹子

您的映射似乎正常。

package forum11937980;

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement(name = "clip")
@XmlAccessorType(XmlAccessType.FIELD)
public class Clip extends StoryElement {

    @XmlPath("adjust-volume/@amount")
    @XmlJavaTypeAdapter(DecibelValueAdapter.class)
    private Double adjustVolume;

    @XmlPath("adjust-volume/param[@name='amount']/fadeIn/@duration")
    @XmlJavaTypeAdapter(TimeValueAdapter.class)
    private TimeValue fadeIn;

    @XmlPath("adjust-volume/param[@name='amount']/fadeOut/@duration")
    @XmlJavaTypeAdapter(TimeValueAdapter.class)
    private TimeValue fadeOut;

}
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
<clip lane="-1" offset="2591065664/720000s" name="Music" duration="22304160/240000s"
    start="176794/48000s" enabled="0" format="r5">
    <adjust-volume amount="1dB">
        <param name="amount">
            <fadeIn type="easeIn" duration="1220/262144s" />
            <fadeOut duration="I/Added/This"/>
        </param>
    </adjust-volume>
    <audio ref="r9" name="VoiceOver-26 - audio" duration="4639346/48000s"
        role="dialogue" />
</clip>

演示

package forum11937980;

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

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum11937980/input.xml");
        Clip clip = (Clip) unmarshaller.unmarshal(xml);

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

}

输出

下面是运行演示代码的输出。请注意,输出中只显示输入中的映射部分。

<?xml version="1.0" encoding="UTF-8"?>
<clip>
   <adjust-volume amount="1.0dB">
      <param name="amount">
         <fadeIn duration="1220/262144s"/>
         <fadeOut duration="I/Added/This"/>
      </param>
   </adjust-volume>
</clip>
package forum11937980;

public class StoryElement {

}
package forum11937980;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class DecibelValueAdapter extends XmlAdapter<String, Double> {

    @Override
    public String marshal(Double v) throws Exception {
        return String.valueOf(v) + "dB";
    }

    @Override
    public Double unmarshal(String v) throws Exception {
        return Double.valueOf(v.substring(0, v.length() - 2));
    }

}
package forum11937980;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class TimeValue {

    @XmlValue
    private String value;

}
package forum11937980;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class TimeValueAdapter extends XmlAdapter<TimeValue, TimeValue> {

    @Override
    public TimeValue marshal(TimeValue v) throws Exception {
        return v;
    }

    @Override
    public TimeValue unmarshal(TimeValue v) throws Exception {
        return v;
    }

}
 类似资料:
  • 问题内容: 我有一个深层的XML结构,其中包含许多没有意义的包装程序,我将它们映射到一个Java类。使用@XmlPath映射简单的数据类型是在公园里散步,但是当涉及到实际上需要自己的类的类型时,我不太确定该怎么做,尤其是当这些类型也应该放在列表中时。 我在将以下示例中的所有类型映射到我的类时遇到问题。由于包装器驻留在使用I 映射的资源中,因此我不能使用,否则我通常会这样做。 示例XML结构 根ja

  • 我有一个很深的XML结构,它有很多无意义的包装器,我要映射到一个Java类。用@xmlpath映射简单的数据类型是一种尝试,但当涉及到实际上需要自己的类的类型时,我不太确定该如何做,特别是当这些类型也应该放在列表中时。 XML结构示例 root.java RefObj.java 更新 在发布了前面的示例之后,我意识到它实际上是按照预期工作的,这让我更加困惑。尽管我试图在生产代码中复制(以前的)工作

  • 我有一个文档,我希望将其存储在ElasticSearch中,并能够对其运行查询,但我认为文档结构可能格式不正确,因此我无法进行有效的查询。 该文档试图是通用的,因此具有一组重复结构。 例如: 注意:我简化了这个例子,就像在真实的文档中一样,重复结构有大约7个字段,其中3个字段将明确标识“类型”。 从上面的示例中,我看不到如何编写映射,因为“值”可以是: 整数 IP地址 只需要用空格标记的字段 约会

  • 我使用的是弹性搜索版本7.1.0和NEST 6.7.0以及ElasticSearch.NET 6.7.0。当我试图创建索引时,我出现了一个错误。 这是我的代码,我在NEST和ElasticSearch.NET 6.4.0版上使用了相同的代码,并且运行良好 null 代码400来自:PUT/local_brainbank_index。servererror:type:mapper_parsing_e

  • 我一直试图通过一个名为Guardian的中间类映射两个用户之间的一些“OneToOne”关系。当我试图检索一个用户(和他的监护人)时,从Glassfish(Open edition V4.0)返回一个内部服务器错误。但是,日志中没有显示任何类型的堆栈跟踪或任何错误。我怀疑问题是我在JPA类中的映射。 启动服务器时,我得到两个与Guardian类有关的警告,但我并不真正理解: 警告:映射到元素[me

  • 我犯了一个错误,比如: 我知道在堆栈溢出中已经出现了一些类似的问题,但解决方案对我来说并不适用。请您检查一下我的实体,以便找出到底是什么导致了这个问题? 使用者 组 角色 控制器方法 痕迹 /vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php(2607):教义\ORM\实用程序\标识符Flattener- 解决了的! 该问题是由重新定义的方法引起