首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >根据不同的请求读取具有多个值的XML主体元素

根据不同的请求读取具有多个值的XML主体元素
EN

Stack Overflow用户
提问于 2019-03-17 13:58:46
回答 1查看 234关注 0票数 1

我正在使用Java解析XML请求。XML结构如下所示:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<TestServices>
    <header>
        //Header Details
    </header>
    <body>
        <ele1>
            <ele2>
                <ele3>534159XXXXXX0176</ele3>  //Or ele_3, ele03, ele_03             
            </ele2>
        </ele1>
    </body>
</TestServices>

我已经为它创建了读取Header和Body元素的类。每个节点都是一个类,我读取的ele3值如下所示。

代码语言:javascript
复制
String ele3 = testServicesRequest.getBody().getEle1().getEle2().getEle3();

根据不同的请求,ele3的元素名称可以不同。我在eclipse中使用过从xsd特性生成Java class,它生成的类如下所示。

代码语言:javascript
复制
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "ele3"
})
public class ReqEle2 {
    @XmlElement(name = "ele3", required = true)
    protected String ele3;
    public String getEle3() {
        return ele3;
    }    
    public void setEle3(String value) {
        this.ele3 = value;
    }    
}

我的要求很简单。我只想为单个getEle3()方法提供多个元素名称。例如:ele_3,ele03,ele_03使用更少的代码更改。或者,请建议我任何其他有效的方法。

现在我试着这样做,我认为这是不好的。

代码语言:javascript
复制
public class ReqEle3 {

    @XmlElement(name = "ele03", required = true)
    protected String ele3_1="";

    @XmlElement(name = "ele_3", required = true)
    protected String ele3_2="";

    @XmlElement(name = "ele3", required = true)
    protected String ele3_3="";

    @XmlElement(name = "ele3_old", required = true)
    protected String ele3_4="";

    public String getEle3() {
        if(ele3_1 != null && !ele3_1.isEmpty()){            
            return ele3_1;  
        }        
        else if(ele3_2 != null && !ele3_2.isEmpty()){           
            return ele3_2;  
        }
        else if(ele3_3 != null && !ele3_3.isEmpty()){           
            return ele3_3;  
        }
        else if(ele3_4 != null && !ele3_4.isEmpty()){           
            return ele3_4;  
        }
        return "";
    }    
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-18 08:37:50

您可以为ele3节点编写自定义的反序列化程序。准确地说,是为ele2节点定制反序列化程序,因为这是最后一个常量节点。下面的示例仅包含理解解决方案所需的部分:

代码语言:javascript
复制
import org.w3c.dom.Element;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.io.StringReader;

public class JaxbApp {

    public static void main(String[] args) throws Exception {
        JAXBContext jaxbContext = JAXBContext.newInstance(ReqEle1.class);
        String xml0 = "<ele1><ele2><ele3>534159XXXXXX0176</ele3></ele2></ele1>";
        String xml1 = "<ele1><ele2><ele_3>534159XXXXXX0176</ele_3></ele2></ele1>";
        String xml2 = "<ele1><ele2><ele03>534159XXXXXX0176</ele03></ele2></ele1>";

        for (String xml : new String[]{xml0, xml1, xml2}) {
            StringReader reader = new StringReader(xml);
            Object unmarshal = jaxbContext.createUnmarshaller().unmarshal(reader);
            System.out.println(unmarshal);
        }
    }
}

@XmlRootElement(name = "ele1")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"ele2"})
class ReqEle1 {

    @XmlJavaTypeAdapter(ReqEle2XmlAdapter.class)
    @XmlElement(name = "ele2", required = true)
    protected ReqEle2 ele2;

    // getters, setters
}

class ReqEle2XmlAdapter extends XmlAdapter<Object, ReqEle2> {

    @Override
    public ReqEle2 unmarshal(Object v) {
        Element element = (Element) v;
        ReqEle2 reqEle2 = new ReqEle2();
        reqEle2.setEle3(element.getFirstChild().getTextContent());

        return reqEle2;
    }

    @Override
    public Object marshal(ReqEle2 v) throws Exception {
        return null; // Implement if needed
    }
}

class ReqEle2 {

    protected String ele3;

    // getters, setters
}

上面的代码打印:

代码语言:javascript
复制
ReqEle1{ele2=ReqEle2{ele3='534159XXXXXX0176'}}
ReqEle1{ele2=ReqEle2{ele3='534159XXXXXX0176'}}
ReqEle1{ele2=ReqEle2{ele3='534159XXXXXX0176'}}

另请参阅:

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

https://stackoverflow.com/questions/55204289

复制
相关文章

相似问题

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