JAXB搜索和删除元素节点

时间:2016-08-09 11:49:31

标签: xml dom xpath jaxb

我已使用JAXB将我的XSD文件转换为JAVA对象。

接下来我做的是将xml文件解组为这些对象。

现在我的目标是添加,删除,搜索XML中的一些节点。

我发现在JAXB中很难做到这一点。

例如,我想匹配任何属性名称为" weight"

我如何在JAXB对象中执行此操作?

在dom XML中,这种搜索/更新/删除非常简单。

我如何在JAXB中执行此操作?

或者例如

我有一个属性名称来匹配"重量"它的类型为interfaceClass。

 <CAEXFile>
<InterfaceCLASSLIB>
<interfaceclass>
<attribute name="weight>
<../>

所以为了访问接口类。

我将不得不浏览所有对象层次结构。

CAEXFile ---&gt;获取InterfaceClassLib()---&gt; getInterfaceClass() - &GT; gettAttributes();

注意每个get方法都返回一个List of Array,因为可以有很多接口类,属性为e.t.c。

这是一种非常昂贵的方法。

我没有找到任何预定义的函数来访问特定节点。

任何帮助将不胜感激。应该转回DOM-XML for xml insert delete update。?

1 个答案:

答案 0 :(得分:1)

正如您所说,使用JAXB搜索节点非常昂贵。我会使用XPathFactory作为标准Java的一部分来获取所需的节点。 如下所示:

public static void main(String[] args) throws Exception 
{
   XPathFactory xpf = XPathFactory.newInstance();
   XPath xpath = xpf.newXPath();

   InputSource xml = new InputSource("<your_path_to_input.xml>");
   Object result = (Object) xpath.evaluate("//attribute[@name=\"weight\"]", xml, XPathConstants.NODESET);
   if ( result != null && result instanceof NodeList )
   {
      NodeList nodeList = (NodeList)result;
      if ( nodeList.getLength() > 0 )
      {
         for ( int i = 0; i < nodeList.getLength(); i++ )
         {
            org.w3c.dom.Node node = nodeList.item( i );
            System.out.println(node.getNodeValue());
         }
      }
   }
}

xpath是//attribute[@name="weight"],它以递归方式在xml中搜索attribute个节点,这些节点的属性名为name,值为weight