JAXB:如何列出具有不同标记名称的相同子元素

时间:2018-06-13 11:31:09

标签: jaxb unmarshalling

我有以下格式的XML:

<servers>
      <server_1>
          <name>S1</name>
          <user>User1</user>
          <pass>pass1</pass>
      </server_1>
      <server_2>
          <name>S2</name>
          <user>User2</user>
          <pass>pass2</pass>
      </server_2>
      <server_3>
          <name>S3</name>
          <user>User3</user>
          <pass>pass3</pass>
      </server_3>
</servers>

服务器下可以有多个子元素。我无法弄清楚如何使用JAXB unmarshel解析这些问题。如果孩子的姓名相同,我可以将他们列入名单。

我还查看了@XMLAnyElement注释,它允许我将这些元素放入列表中,但是我遇到了一些类型转换问题,因为这样做会给ElementNSImpl,然后我必须将它转换为一个简单的Server入口类。这是处理此类案件的唯一方法吗?

我不能在@ XMLElement的名称字段中使用正则表达式来填充忽略不同标记(server_1,server_2等)的这些条目,或者忽略不同子元素标记的任何其他方式。

我使用本指南来理解XMLAnyElement行为:http://blog.bdoughan.com/2010/08/using-xmlanyelement-to-build-generic.html但这不是我的用例。

我想到的另一种方法是在取消XML文件之前修改父xml本身并使用Java FileReaders将server_X类型标记替换为服务器。

我会感谢帮助或指出我正确的方向。

编辑:我看到以下代码有效 -

    ..
    ..
     @XmlAnyElement
        public List<ElementNSImpl> getServer() {
            return server;
        }
    ..
    ..
public void printElem() {
        if(server!=null) {
            for(ElementNSImpl serverEntry :server) {
                NodeList nodeList= ftpEntry.getChildNodes();
                System.out.println("length:"+nodeList.getLength());
                for(int i=0;i<nodeList.getLength()-1;i++)
                    System.out.println(nodeList.item(i).getNodeName()+" :"+nodeList.item(i).getTextContent());
            }
        }
    }

但java直接使用ElementNSImpl发出警告信息:

Access restriction: The type 'ElementNSImpl' is not API (restriction on required library 'C:\Program Files (x86)\Java\jre1.8.0_171\lib\rt.jar')

所以我不确定是否可以像这样使用ElementNSImpl。

0 个答案:

没有答案