2016-12-16 16 views
2

XML解析に若干の問題があります。JavaへのXML解析 - ルート属性値の取得

私は、パラメータがXMLファイルの特定の「要素」である関数を作成しています。 見つかったら、私はルート属性の値を返したいと思います。 は、ここに私のコードです:

     FileInputStream file = new FileInputStream(new File("C:\\Users\\Grizzly\\Java\\Projet_16_17-20161214\\bdd.xml")); 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     Document doc = builder.parse(file); 
     doc.getDocumentElement().normalize(); 
     NodeList nList = doc.getElementsByTagName("type"); 
     for (int temp = 0; temp < nList.getLength(); temp++) 
     { 
      Node nNode = nList.item(temp); 
      if(nNode.toString().equalsIgnoreCase(element)) 
      { 
        Element eElement = (Element) nNode; 
        System.out.println("Taxe= "+ eElement.getAttribute("taxe")); 
      } 
     } 
    } 

これを行う方法上の任意のアイデア? はここに私のXMLファイルです:私のコードで

<?xml version="1.0"?> 

-<types> 


-<type id="Nourriture" taxe="0.1"> 

<element>pomme</element> 

<element>fraise</element> 

<element>fromage</element> 

<element>viande rouge </element> 

</type> 


-<type id="Matiere Premiere" taxe="0.2"> 

<element>fer</element> 

<element>polypropylene</element> 

</type> 


-<type id="Element Solide" taxe="0.3"> 

<element>voiture</element> 

<element>planche surf</element> 

<element>pistolet</element> 

</type> 

</types> 

、私はノードリストから特定のノードの要素を取得し、ユーザーの入力した文字列「要素」と比較してみました、と一致した場合は、それにリンクされているタクシーの属性値をチェックします。

ありがとうございます。

EDIT:

NodeList nList = doc.getElementsByTagName("type"); 

for (int temp = 0; temp < nList.getLength(); temp++) 
    { 
     Node nNode = nList.item(temp); 
     NodeList nChildren = nNode.getChildNodes(); 
     Element eElement = (Element) nNode; 
     for(int i = 0; i < nChildren.getLength(); i++) 
     { 
      String onElement = eElement.getElementsByTagName("element").item(i).getTextContent(); 
      if(onElement.equalsIgnoreCase(element)) 
      { 
       System.out.println("id : " + eElement.getAttribute("id")); 
       System.out.println("taxe : " + eElement.getAttribute("taxe")); 
       break; 
      } 
     } 
} 

をしかし、それだけで...最初の要素を読んでいると、アイテム(i)が動作していない:私は私が必要なものに近づいています。

答えて

1

私が正しくあなたを理解していれば、あなたは特定の名前(element)を有する少なくとも一つの子要素を持つすべての文書ノードの特定の属性(idtaxe)をフェッチしようとしています。

DOMを反復して状態を維持することで問題は解決できますが、私はむしろこのタスクをXPathに委任したいと思います。 XPathを使用したコードはより洗練されたものになり、保守性が向上します。たとえば、属性がid,taxe、子要素がelementのすべての要素を取得するには、//*[@id and @taxe element]のようなXPath式を使用できます。一致するノードは単一の行にフェッチされます。次の例に示すように、単純にノードを反復して属性を収集できます。

id: Nourriture 
taxe: 0.1 
id: Matiere Premiere 
taxe: 0.2 
id: Element Solide 
taxe: 0.3 

public static void main(String args[]) { 
    String element = args.length > 0 ? args[0] : "element"; 

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    try { 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     FileInputStream file = new FileInputStream(new File("/some/file.xml")); 
     Document doc = builder.parse(file); 
     XPath xPath = XPathFactory.newInstance().newXPath(); 
     String expression = "//*[@id and @taxe and " + element + "]"; 
     NodeList nodeList = (NodeList) xPath.compile(expression) 
       .evaluate(doc, XPathConstants.NODESET); 
     for (int i = 0; i < nodeList.getLength(); i++) { 
      Node node = nodeList.item(i); 
      NamedNodeMap attributes = node.getAttributes(); 
      for (int j = 0; j < attributes.getLength(); j++) { 
       Node aNode = attributes.item(j); 
       System.out.printf(
        "%s: %s\n", 
        aNode.getNodeName(), 
        aNode.getNodeValue() 
       ); 
      } 
     } 
    } catch (Exception e) { 
     System.err.println(e.getMessage()); 
     System.exit(1); 
    } 
} 

サンプル出力、印刷親要素の全て属性上記サンプル。

String aName = aNode.getNodeName(); 
if (aName.equals("taxe")) { // ... 

しかし、あなたは実際のXPathと属性フィルタで除外することができます:あなたが唯一の特定のものを印刷したい場合は、明らかに、このような些細なチェックを追加することができます

String expression = "//*[ " + element + "]/@*[name() = 'id' or name() = 'taxe']"; 
NodeList nodeList = (NodeList) xPath.compile(expression) 
     .evaluate(doc, XPathConstants.NODESET); 
for (int i = 0; i < nodeList.getLength(); i++) { 
    Node node = nodeList.item(i); 
    System.out.printf("%s: %s\n", node.getNodeName(), node.getNodeValue()); 
} 

上記のXPath式を名前がid、またはtaxeのすべての属性ノードをフェッチします。すべての属性が必要な場合は、最後の条件を削除するだけです。

String expression = "//*[ " + element + "]/@*";