2017-05-16 12 views
1

나는 여러 레벨 (레벨 1, 레벨 2, 레벨 3)을 가진 다음 XML을 가지고있다. 모든 레벨 1은 그림과 같이 탭으로 들어갑니다. xml에서 자바로 파싱하기

<?xml version="1.0" encoding="UTF-8"?> 
<treeNode label="projectTags" level="0"> 
    <reference/> 
    <treeNode label="category" level="1"> 
     <reference> 
      <dataField name="category_id" value="2"/> 
      <dataField name="labelFieldValue" value="IRIS"/> 
      <dataField name="category" value="IRIS"/> 
      <dataField name="labelFieldName" value="Category"/> 
      <dataField name="idFieldName" value="category_id"/> 
      <dataField name="idFieldValue" value="2"/> 
     </reference> 
     <treeNode label="project" level="2"> 
      <reference> 
       <dataField name="category_id" value="2"/> 
       <dataField name="projectvisible" value="1"/> 
       <dataField name="project" value="Acenaphthene"/> 
       <dataField name="labelFieldValue" value="Acenaphthene"/> 
       <dataField name="labelFieldName" value="Project"/> 
       <dataField name="projectactive" value="1"/> 
       <dataField name="idFieldName" value="Project_id"/> 
       <dataField name="idFieldValue" value="1436"/> 
       <dataField name="project_id" value="1436"/> 
       <dataField name="casrn" value="83-32-9"/> 
      </reference> 
     </treeNode> 
     <treeNode label="project" level="2"> 
      <reference> 
       <dataField name="category_id" value="2"/> 
       <dataField name="projectvisible" value="1"/> 
       <dataField name="project" value="Acetaldehyde"/> 
       <dataField name="labelFieldValue" value="Acetaldehyde"/> 
       <dataField name="labelFieldName" value="Project"/> 
       <dataField name="projectactive" value="1"/> 
       <dataField name="idFieldName" value="Project_id"/> 
       <dataField name="idFieldValue" value="37"/> 
       <dataField name="project_id" value="37"/> 
       <dataField name="casrn" value="75-07-0"/> 
      </reference> 
      <treeNode label="usage" level="3"> 
       <reference> 
        <dataField name="usageVisible" value="1"/> 
        <dataField name="labelFieldValue" value="1991 IRIS"/> 
        <dataField name="usage_id" value="1158"/> 
        <dataField name="usageActive" value="1"/> 
        <dataField name="parent_usage" value=""/> 
        <dataField name="projectActive" value="1"/> 
        <dataField name="parent_usage_id" value=""/> 
        <dataField name="idFieldName" value="usage_id"/> 
        <dataField name="projectVisible" value="1"/> 
        <dataField name="isdefault" value="0"/> 
        <dataField name="usage" value="1991 IRIS"/> 
        <dataField name="description" value=""/> 
        <dataField name="labelFieldName" value="usage"/> 
        <dataField name="idFieldValue" value="1158"/> 
        <dataField name="project_id" value="37"/> 
       </reference> 
      </treeNode> 
     </treeNode> 
    </treeNode> 
    <treeNode label="category" level="1"> 
      <reference> 
       <dataField name="category_id" value="1"/> 
       <dataField name="labelFieldValue" value="NAAQS"/> 
       <dataField name="category" value="NAAQS"/> 
       <dataField name="labelFieldName" value="Category"/> 
       <dataField name="idFieldName" value="category_id"/> 
       <dataField name="idFieldValue" value="1"/> 
      </reference> 
      <treeNode label="project" level="2"> 
       <reference> 
        <dataField name="category_id" value="1"/> 
        <dataField name="projectvisible" value="1"/> 
        <dataField name="project" value="Aquatic Acidification"/> 
        <dataField name="labelFieldValue" value="Aquatic Acidification"/> 
        <dataField name="labelFieldName" value="Project"/> 
        <dataField name="projectactive" value="1"/> 
        <dataField name="idFieldName" value="Project_id"/> 
        <dataField name="idFieldValue" value="1576"/> 
        <dataField name="project_id" value="1576"/> 
        <dataField name="casrn" value=""/> 
       </reference> 
       <treeNode label="usage" level="3"> 
        <reference> 
         <dataField name="usageVisible" value="1"/> 
         <dataField name="labelFieldValue" value="All refs"/> 
         <dataField name="usage_id" value="651"/> 
         <dataField name="usageActive" value="1"/> 
         <dataField name="parent_usage" value=""/> 
         <dataField name="projectActive" value="1"/> 
         <dataField name="parent_usage_id" value=""/> 
         <dataField name="idFieldName" value="usage_id"/> 
         <dataField name="projectVisible" value="1"/> 
         <dataField name="isdefault" value="0"/> 
         <dataField name="usage" value="All refs"/> 
         <dataField name="description" value=""/> 
         <dataField name="labelFieldName" value="usage"/> 
         <dataField name="idFieldValue" value="651"/> 
         <dataField name="project_id" value="1576"/> 
        </reference> 
        <treeNode label="usage" level="4"> 
         <reference> 
          <dataField name="usageVisible" value="1"/> 
          <dataField name="labelFieldValue" value="Hydrology"/> 
          <dataField name="usage_id" value="652"/> 
          <dataField name="usageActive" value="1"/> 
          <dataField name="parent_usage" value="All refs"/> 
          <dataField name="projectActive" value="1"/> 
          <dataField name="parent_usage_id" value="651"/> 
          <dataField name="idFieldName" value="usage_id"/> 
          <dataField name="projectVisible" value="1"/> 
          <dataField name="isdefault" value="0"/> 
          <dataField name="usage" value="Hydrology"/> 
          <dataField name="description" value=""/> 
          <dataField name="labelFieldName" value="usage"/> 
          <dataField name="idFieldValue" value="652"/> 
          <dataField name="project_id" value="1576"/> 
         </reference> 
        </treeNode> 
       </treeNode> 
      </treeNode> 
     </treeNode> 
    </treeNode> 

나는 그것이

enter image description here

나는 다음과 같은 코드를 사용하고 같이

private DefaultMutableTreeNode buildTreeNode(Node rootNode) 
     { 
      DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode(rootNode.getNodeName()); 

      System.out.println("root\t" + rootNode.getNodeName() + "\t" + rootNode.getNodeValue()); 
      if (rootNode.hasAttributes()) 
      { 
       NamedNodeMap attributes = rootNode.getAttributes(); 

      if (attributes.item(0).toString().contains("labelFieldValue")) 
      { 
       System.out.println(attributes.item(0).toString() + "\t" + attributes.item(1).toString()); 
       String attr = attributes.item(1).toString(); 
       treeNode.add(new DefaultMutableTreeNode("@" + attr)); 
      } 
     } 

     if (rootNode.hasChildNodes()) 

     { 
      NodeList children = rootNode.getChildNodes(); 

      for (int i = 0; i < children.getLength(); i++) 
      { 
       Node node = children.item(i); 
       short nodeType = node.getNodeType(); 

       if (nodeType == Node.ELEMENT_NODE) 
       { 
        treeNode.add(buildTreeNode(node)); 
       } 
       else if (nodeType == Node.TEXT_NODE) 
       { 
        String text = node.getTextContent().trim(); 
        if (!text.equals("")) 
         treeNode.add(new DefaultMutableTreeNode(text)); 

       } 
      } 
     } 
     return treeNode; 
    } 

를 만들기 위해, JTree에로 구문 분석이 필요하지만 난 enter image description here

다음 얻을

어떻게 해결할 수 있습니까? "labelFieldValue"아래에있는 값만 표시해야합니다.

답변

2
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    File f = new File("Elements2.xml"); 
    Document d = builder.parse(f); 
    Node node= d.getDocumentElement(); 
    DefaultMutableTreeNode parent = new DefaultMutableTreeNode(); 
    parent = buildTreeNode(parent, node); 
    final DefaultMutableTreeNode finalnode = parent; 

    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(finalnode); 
     } 
      }); 


} 

private static void createAndShowGUI(DefaultMutableTreeNode parent){ 
    final JFrame frame = new JFrame("Split Pane Example"); 
    // Display the window. 
    frame.setSize(500, 300); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    // set grid layout for the frame 
    frame.getContentPane().setLayout(new GridLayout(1, 1)); 

    JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); 
    tabbedPane.addTab("IRIS", makePanel("IRIS", parent, 0)); 
    tabbedPane.addTab("NAAQS", makePanel("NAAQS", parent, 1)); 
    frame.getContentPane().add(tabbedPane); 
} 

private static JPanel makePanel(String text, DefaultMutableTreeNode parent, int i) { 
      JPanel p = new JPanel(); 
      //p.add(new Label(text)); 
      p.setLayout(new GridLayout(1, 1)); 
      JTree jtree = new JTree(parent.getChildAt(i)); 
      JScrollPane sp = new JScrollPane(jtree); 
      p.add(sp); 
      return p; 
     } 

private static boolean specialCase = false; 
private static DefaultMutableTreeNode buildTreeNode(DefaultMutableTreeNode parent, Node parentNode){ 
    DefaultMutableTreeNode currentLevel = null; 
    if (parentNode.getNodeName().equals("treeNode")){ 
     NodeList children = parentNode.getChildNodes(); 
     for (int i =0 ;i<children.getLength();i++){ 
      Node node = children.item(i); 
      if (node.getNodeName().equals("reference") && !node.hasChildNodes()){ 
       currentLevel = new DefaultMutableTreeNode("root"); 
       specialCase = true; 

      } 
      else if (node.getNodeName().equals("reference") && node.hasChildNodes()){ 
       NodeList dataFields = node.getChildNodes(); 
       for (int j =0 ;j<dataFields.getLength();j++){ 
        Node dataField = dataFields.item(j); 
        NamedNodeMap attributes = dataField.getAttributes(); 
        if (attributes!=null && attributes.item(0).toString().contains("labelFieldValue")){ 
         String attr = attributes.item(1).toString(); 
         currentLevel = new DefaultMutableTreeNode("@"+attr); 
         parent.add(currentLevel); 
         break; 
        }     
       } 
      } 
      else if (node.getNodeName().equals("treeNode") && node.hasChildNodes() && specialCase){ 
       specialCase = false; 
       parent = buildTreeNode(currentLevel,node); 
      } 
      else if (node.getNodeName().equals("treeNode") && node.hasChildNodes() && !specialCase){ 
       currentLevel = buildTreeNode(currentLevel,node); 
      } 
     } 
    } 
    return parent; 
} 
+0

실제로 실제로는 너무 가깝지만 정확히 원하는 방식이 아닙니다. 현재 모든 것이 루트 노드 아래에 있습니다. 그와 같은 IRIS는 부모 노드이며 Acetaldehyde에는 또 다른 자식 인 IRIS가있는 Acenaphthene와 Acetaldehyde라는 두 개의 자식 노드가 있습니다. 따라서 기본적으로 레벨을 살펴보면 계층 구조가 정의 된 방식을 알 수 있습니다. – user1631306

+0

좋아. 휴. 논리를 생각해 내는데 꽤 오래 걸렸어. dataField가없는 루트 레벨 'reference'요소의 특별한 경우를 처리하기 위해 전역 부울 변수를 도입해야했습니다. 괜찮 으면 좋겠어? 전체 답변을 업데이트했습니다. 알려줘. – Ray

+0

굉장합니다. 그 일은 훌륭했습니다. 마지막 한가지. 레벨 = 1 인 IRIS와 같은 7 가지 레벨이 있습니다 (제 질문에있는 이미지를 참조하십시오). JTab, IRIS, NAAQS, PPRTV 등으로 넣을 수 있습니까?) – user1631306