2016-08-09 11 views
0

JAXBを使用してXSDファイルをJAVAオブジェクトに変換しました。JAXB要素ノードの検索と削除

次のことは、これらのオブジェクトにXMLファイルをアンマーシャリングすることでした。

私の目標は、XMLのいくつかのノードを追加、削除、検索することです。

私はJAXBでこれを行うのが非常に難しいと感じています。

たとえば、属性名= "weight"のノードに一致させたいとします。

JAXBオブジェクトでこれを行うにはどうすればよいですか?

dom XMLでは、この検索/更新/削除は非常に簡単です。

JAXBでこれを行うにはどうすればよいですか?

または例えば

私はタイプinterfaceClassである「重」と一致する属性名を持っています。

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

インターフェイスクラスにアクセスするためです。

私はすべてのオブジェクトの階層を通過する必要があります。

CAEXFile ---> get InterfaceClassLib()---> getInterfaceClass() - > gettAttributes();

すべてのgetメソッドは、インターフェイスクラス、属性e.t.cが多数ある可能性があるため、Arrayのリストを返します。

これは非常に高価な方法です。

特定のノードに到達するための定義済み機能が見つかりませんでした。

ご協力いただければ幸いです。 xmlのDOM-XMLを元に戻す必要があります。

答えて

1

あなたが言ったように、JAXBを使ってノードを検索するのは高価です。私は標準的なJavaの一部として利用可能なXPathFactoryを使用して目的のノードを取得します。 以下のように:XPathは//attribute[@name="weight"]ある

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()); 
     } 
     } 
    } 
} 

、それは再帰的に属性が値とnameと呼ばれているattributeノードのXMLを検索weight

関連する問題