2017-02-08 3 views
1

이것은 실제로 2GB 이상인 샘플 XML 파일입니다. 내가이 정도 달성 ​​VTD-XML을 사용하여 :attr 이름을 하드 코딩하지 않고 vtd-xml을 사용하여 XML을 구문 분석하는 방법은 무엇입니까?

현재 코드 :

https://gist.github.com/shadow-fox/21d1d4f30cbed0909f403c3ac0e1fa4d

public void reader() throws IOException, ParseException, NavException, XPathParseExceptionHuge, NavExceptionHuge, 
      XPathEvalExceptionHuge { 
     VTDGenHuge vg = new VTDGenHuge(); 
    if (vg.parseFile("sku_extract_main.xml",true,VTDGenHuge.MEM_MAPPED)) { 
     VTDNavHuge vnh = vg.getNav(); 
     AutoPilotHuge aph = new AutoPilotHuge(vnh); 
     aph.selectElementNS("*", "*"); 
     int i = 0; 
     while (aph.iterate()) { 
      int t = vnh.getText(); 
      if (t != -1) { 
       System.out.println(vnh.toString(vnh.getCurrentIndex()) + "|||" + vnh.toNormalizedString(t)); 
       i++; 
      } 
     } 
    } 
} 

현재 결과 :

PVAL|||298374234 
PVAL|||1231 
PVAL|||brown 
PVAL|||medium 
PVAL|||7 
PVAL|||solid 
PVAL|||brown 

내가 원하는 무엇 :

,
Sku_ID|||298374234 
LotNum|||1231 
COLOR|||brown 
WIDTH|||medium 
SIZE|||7 
Pattern|||solid 
Color Family|||brown 

샘플 XML :

<?xml version="1.0" encoding="UTF-8" ?> 
<RECORDS> 
    <RECORD> 
    <PROP NAME="Sku_ID"> 
     <PVAL>298374234</PVAL> 
    </PROP> 
    <PROP NAME="LotNum"> 
     <PVAL>1231</PVAL> 
    </PROP> 
    <PROP NAME="COLOR"> 
     <PVAL>brown</PVAL> 
    </PROP> 
    <PROP NAME="WIDTH"> 
     <PVAL>medium</PVAL> 
    </PROP> 
    <PROP NAME="SIZE"> 
     <PVAL>7</PVAL> 
    </PROP> 
    <PROP NAME="Pattern"> 
     <PVAL>solid</PVAL> 
    </PROP> 
    <PROP NAME="Color Family"> 
     <PVAL>brown</PVAL> 
    </PROP> 
    </RECORD> 
</RECORDS> 

그리고 나는 attr 이름을 하드 코드 싶지 않아요. 내가 그들을 방문 할 때 그들을 되찾고 싶다. 어떻게하면 좋을까요? 다음은

답변

1

이 코드의 내 편집 이름과 값 ATTR를 인쇄하는 것입니다 ...이 XPath를 기반으로 ...

public static void main(String s[]) throws Exception{ 
    VTDGenHuge vg = new VTDGenHuge(); 
     if (vg.parseFile("d:\\xml\\sku_extract_main.xml",true,VTDGenHuge.MEM_MAPPED)) { 
      VTDNavHuge vnh = vg.getNav(); 
      AutoPilotHuge aph = new AutoPilotHuge(vnh); 
      AutoPilotHuge aph2 = new AutoPilotHuge(vnh); 
      aph.selectElementNS("*", "*"); 
      aph2.selectXPath("@*"); 
      int i = 0; 
      while (aph.iterate()) { 
       System.out.println(vnh.toString(vnh.getCurrentIndex())); 
       int t = vnh.getText(); 
       if (t != -1) { 
        System.out.println(vnh.toString(vnh.getCurrentIndex()) + "|||" + vnh.toNormalizedString(t)); 
        i++; 
       } 

// below is the my addition 
// it basically evaluates the attribute axis 
// push pop ensure that the node iteration of the outer while loop 
// is consistent 
// resetXPath is key here, without it, xpath will not work except for the 
// first node returned by aph.iterate() 
       vnh.push(); 

       while((i=aph2.evalXPath())!=-1){ 
        System.out.println(" attr name "+vnh.toString(i)); 
        System.out.println("attr val "+vnh.toString(i+1)); 
       } 
       aph2.resetXPath(); 
       vnh.pop(); 
      } 
} 
+0

당신은 무엇 무엇을하고 있는지에 대한 설명을 추가시겠습니까? '''vnh.toNormalizedString (t)''이것은 attr의 값을 나에게 준다. 298374234, 그러나 if 범위 안에서만 존재하지만'''IndexOutOfBoundsException'''을 던지는 while 범위에서는 그렇지 않습니다. 그리고'''vnh.toString (i + 1)''은 attr의 이름을 나에게 준다. Sku_ID. –

+0

indexoutofBoundsException은 무엇을 의미합니까? –

+0

i는 attr 이름의 인덱스입니다. i + 1은 항상 attr val의 인덱스입니다 ... –