如何使用dom解析器或其他方法读取xml中的嵌套元素

时间:2014-07-29 11:18:56

标签: java arrays xml parsing dom

我想读取嵌套元素并将所有元素和数据分配给二维数组。 在以下xml示例中,元素为<M-1>,<M-11>,<M-111>,<M-2>,<M-22>,<M-3>,数据为m111,m22,m3。    我希望转移到2D数组,就像String array[][] = {{"M-1","M-11","M-111","m111"},{"M-2","M-22","m22"},{"M-3","m3"}};谢谢。

<MENU>

 <M-1>
  <M-11>
   <M-111>m111</M-111>
  </M-11>
 </M-1>

 <M-2>
  <M-22>m22</M-22>
 </M-2>

 <M-3>m3</M-3>

 ...

</MENU>

1 个答案:

答案 0 :(得分:0)

我已经解决了。这是一个非常复杂的。

XML:

<M><A_1.1><A_1.2><A_1.3><A_1.4><A_1.5><A_1.6><A_1.7>Content-1A</A_1.7></A_1.6></A_1.5></A_1.4></A_1.3></A_1.2></A_1.1><B_2.1><B_2.2><B_2.3><B_2.4><B_2.5>Content-2B</B_2.5></B_2.4></B_2.3></B_2.2></B_2.1><C_3.1><C_3.2><C_3.3><C_3.4><C_3.5><C_3.6><C_3.7><C_3.8><C_3.9><C_3.10>Content-3C</C_3.10></C_3.9></C_3.8></C_3.7></C_3.6></C_3.5></C_3.4></C_3.3></C_3.2></C_3.1><D_4.1><D_4.2><D_4.3>Content-4D</D_4.3></D_4.2></D_4.1><E_5.1>Content-5E</E_5.1><F_6.1><F_6.2>Content-6F</F_6.2></F_6.1><G_7.1><G_7.2><G_7.3><G_7.4>Content-7G</G_7.4></G_7.3></G_7.2></G_7.1></M>

爪哇:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XmlReader1 {

    public XmlReader1() {

        try {

            String str = ""; String strAdd;
            String bR  = "<(?!/)(.*?)>";
            String pR  = ">(?!<)(.*?)<(/.*?)>";
            File file = new File("E:\\test\\b.xml");
            BufferedReader br = null;
            int s1 = 0; int s2 = 0; int s3 = 0; int s31 = 0; int mb = 0; int mp = 0;

            //dosyadan verinin çekilip str stringine atanması.
            br = new BufferedReader(new FileReader(file));
            while ((strAdd = br.readLine()) != null) {
                str += strAdd; 
            }

            Pattern pattern1 = Pattern.compile(bR);
            Matcher matcher1 = pattern1.matcher(str);

            Pattern pattern2 = Pattern.compile(pR);
            Matcher matcher2 = pattern2.matcher(str);

            Pattern pattern3 = Pattern.compile(bR);
            Matcher matcher3 = pattern3.matcher(str);

            Pattern pattern4 = Pattern.compile(pR);
            Matcher matcher4 = pattern4.matcher(str);

            //dosyadaki elementlerin(<...>) sayılması.
            while (matcher1.find()) {
                mb++;
            }

            //dosyadaki çocuk elementlerin(<...>child</..>) sayılması.
            while (matcher2.find()) {
               mp++;
            }

            //elementler dizisi.
            String mB[] = new String[mb];
            //çocuk elemanlar dizisi.
            String mP[] = new String[mp];

            //dosyadaki elementlerin mP[] dizisine atanması.
            while (matcher4.find()) {
               mP[s2] = matcher4.group(1);
               s2++;
            }

            //dosyadaki çocuk elemanların mB[] dizisine atanması.
            while (matcher3.find()) {
                mB[s1] = matcher3.group(1);
                s1++;
            }

            //dom parser işlemleri.
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new FileInputStream(file));

            NodeList nL = doc.getElementsByTagName(doc.getDocumentElement().getNodeName());
            Node nD = nL.item(0);
            Element eL = (Element) nD;

            int big[] = new int[mp];            
            //element gruplarının kaç kişi olduğunun bulunması.
            for (int i = 0; i < mp; i++) {
                for (int j = 1; j < mb; j++) {

                    String a = eL.getElementsByTagName(mB[j]).item(0).getTextContent();
                    String b = mP[i];

                        if (a.equals(b)) {
                            s3++;
                        }       
                }   
                    big[i] = s3;
                    s3 = 0;
            }               

            //2 boyutlu ana dizinin dinamik sütun sayıları belirtilmeden tanımlanması.
            String add[][] = new String[mp][];      

            //ana diziye element ve elemanların birbirine bağlanarak atanması.
            for (int i = 0; i < mp; i++) {

                //ana dizinin sütun sayısı, her element-eleman grubunun sayısına göre oluşturulması.
                add[i] = new String[big[i]+1];

                //ana diziye elementleri ekleme işlemi.
                for (int j = 1; j < mb; j++) {

                    //verilen mB[] dizisindeki elementin ismine göre, o elementin çocuğunun bulunması.
                    String a = eL.getElementsByTagName(mB[j]).item(0).getTextContent();
                    //çocuk elemanlar dizisi.
                    String b = mP[i];

                        //String a'daki ortak çocuğa sahip elementlerin aynı dalda gruplandırılması.
                        if (a.equals(b)) {
                            add[i][s3] = mB[j];
                            s3++;
                        }       
                }   
                    //gruplanan elementlere çocukların eklenmesi.
                    add[i][s3] = mP[i];
                    s3 = 0;
            }

            //ana dizinin yazdırılması.
            for (int i = 0; i < add.length; i++) {
                for (int j = 0; j < add[i].length; j++) {
                    System.out.println(add[i][j]);
                }
            }



        } catch (Exception e) {
            System.err.println("Hata!");
        }

    }

    public static void main(String[] args){

        XmlReader1 x = new XmlReader1();

    }
}   

屏幕:

A_1.1
A_1.2
A_1.3
A_1.4
A_1.5
A_1.6
A_1.7
Content-1A
B_2.1
B_2.2
B_2.3
B_2.4
B_2.5
Content-2B
C_3.1
C_3.2
C_3.3
C_3.4
C_3.5
C_3.6
C_3.7
C_3.8
C_3.9
C_3.10
Content-3C
D_4.1
D_4.2
D_4.3
Content-4D
E_5.1
Content-5E
F_6.1
F_6.2
Content-6F
G_7.1
G_7.2
G_7.3
G_7.4
Content-7G