当前位置: 首页 > 面试题库 >

使用JAXB处理设计不良的XML

诸葛雅达
2023-03-14
问题内容

我目前正在使用JAXB替换旧系统,并且在解析XML时遇到问题。系统的首要要求是它必须是即插即用的替代品,因此我不能修改XML的格式。以下是给我麻烦的XML部分。

<xx>
    <s1>
        <X>-9999</X>
        <Y>-9999</Y>
    </s1>
    <s2>
        <X>-9999</X>
        <Y>-9999</Y>
   </s2>
</xx>

XML的问题在于,所有s#对象都是完全相同的,最多可以包含256个。JAXB中是否可以注释此类标记,还是必须创建256个单独的注释?非常感激任何的帮助。

这是xx对象的Java代码。注意:最初对对象进行编程时要理解只有2个s#对象,但是此后已更改。

@XmlRootElement(name="xx")

public class XMLXx implements Serializable {

    private static final long serialVersionUID = 4064597372833234503L;

    private XMLSite siteOne;
    private XMLSite siteTwo;

    @XmlElement(name="s1")
    public XMLSite getSiteOne() {
        return siteOne;
    }

    public void setSiteOne(XMLSite s1) {
        this.siteOne = s1;
    }

    @XmlElement(name="s2")
    public XMLSite getSiteTwo() {
        return siteTwo;
    }

    public void setSiteTwo(XMLSite s2) {
        this.siteTwo = s2;
    }
}

这是XMLSite对象:

public class XMLSite implements Serializable {

    private static final long serialVersionUID = -4374405403222014476L;

    private Integer x;
    private Integer y;

    @XmlElement(name="X")
    public Integer getX() {
        return x;
    }

    public void setX(Integer x) {
        this.x = x;
    }

    @XmlElement(name="Y")
    public Integer getY() {
        return y;
    }

    public void setY(Integer y) {
        this.y = y;
    }
}

问题答案:

如果要s#作为集合处理这些项目:

import java.io.Serializable;
import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="xx")
public class XMLXx implements Serializable {

    private static final long serialVersionUID = 4064597372833234503L;

    private List<XMLSite> sites;

    @XmlElement(name="s")
    public List<XMLSite> getSites() {
        return sites;
    }

    public void setSites(List<XMLSite> sites) {
        this.sites = sites;
    }

}

然后,你可以不喜欢愚弄JAXB以为所有元素(s1s2等)实际上是被称为s

import java.io.FileInputStream;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.util.StreamReaderDelegate;

public class Demo {

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

        XMLInputFactory xif = XMLInputFactory.newInstance();
        XMLStreamReader xsr = xif.createXMLStreamReader(new FileInputStream("input.xml"));
        xsr = new SiteStreamReaderDelegate(xsr);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        XMLXx object = (XMLXx) unmarshaller.unmarshal(xsr);
        System.out.println(object.getSites().size());

    }

    private static class SiteStreamReaderDelegate extends StreamReaderDelegate {

        public SiteStreamReaderDelegate(XMLStreamReader xsr) {
            super(xsr);
        }

        @Override
        public String getLocalName() {
            String localName = super.getLocalName();
            if(localName.startsWith("s")) {
                return "s";
            }
            return localName;
        }

    }
}

有关类似的示例,请参见:

  • http://bdoughan.blogspot.com/2010/12/case-insensitive-unmarshalling.html


 类似资料:
  • 问题内容: 我有看起来像这样的XML: 我想使用JAXB进行阅读。 我知道我能做 如果XML看起来像 ,但是我对上面的XML布局怎么办? 问题答案: 注意: 我是EclipseLink JAXB(MOXy)的负责人,并且是JAXB 2.X(JSR-222)专家组的成员。 您可以在此用例中使用MOXy的扩展名:

  • 我正在尝试使用restTemplate(Spring)和Jackson 2.3.0构建一个JSON Web服务消费者 问题在于pojo的绑定,如下所示: Jackson输出以下错误: org.springframework.http.converter.HttpMessageNotReadableException:无法读取JSON:无法识别的字段"montant_TTC"(类com.bouygt

  • 问题内容: 我正在使用具有以下功能的simplehtmldom: 我这样使用它: 有时,URL可能只是无效的,我想对此进行处理。我以为我可以使用try and catch,但是这没有用,因为它不会抛出异常,它只是给出了这样的php警告: 第39行在上面的代码中。 我如何正确处理此错误,我可以只使用普通条件,它看起来不像返回布尔值。 谢谢大家的帮助 更新资料 这是一个好的解决方案吗? 问题答案: 这

  • 问题内容: 我正在使用JAXB动态生成XML。 现在,我想使用XSL将其转换为HTML。我该如何包括 在动态生成的XML中? 问题答案: 这里的所有解决方案都非常丑陋和冗长。只需在Mashaller对象内部设置一行即可指定其他标题。 本示例将使用样式表将对象输出到文件,并很好地格式化元素以供人类阅读。该对象属于类,并将被写入file,并由给出的样式表设置格式: 更新资料 在最新版本的JAXB中,我

  • 问题内容: 我是一名初级软件工程师,曾负责接管旧系统。根据我的初步评估,该系统存在几个问题。 意大利面代码 重复码 10k行及以上的课程 使用log4j滥用和过度记录 错误的数据库表设计 缺少源代码管理->我为此设置了Subversion 缺少文档->除了阅读代码外,我对业务规则一无所知 我应该如何处理才能提高系统质量并解决此类问题?我可以考虑使用静态代码分析软件来解决任何不良的编码做法。 但是,

  • 问题内容: 在我的一个项目中,我有两个“数据传输对象” RecordType1和RecordType2,它们从RecordType的抽象类继承。 我希望两个RecordType对象在“ process”方法中由相同的RecordProcessor类处理。我的第一个想法是创建一个通用的处理方法,该方法将两个特定的处理方法委托给以下人员: 我读过Scott Meyers在 Effective C ++