2014-06-17 7 views
1

나는 그런 XML 파일이 있습니다자바 : JAXP 예상치 못한 구문 분석 값 (목록에 XML을 구문 분석 <목록 <String>>)

<?xml version="1.0" encoding="ISO-8859-2"?> 
<some some1="string" some2="string"> 
<value1>string</value1> 
<value2>string</value2> 
<position1> 
    <someval1>string</someval1> 
    <someval2>string</someval2> 
    <someval3>string</someval3> 
    <someval4>string</someval4> 
</position1> 
<position2> 
    <someval1>string</someval1> 
    <someval2>string</someval2> 
    <someval3>string</someval3> 
    <someval4>string</someval4> 
</position2> 

을 그리고 난 다음 코드를 작성 :

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
factory.setNamespaceAware(true); // never forget this! 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document doc = builder.parse(Vars.LOCAL_PATH + fileName); 
XPath xPath = XPathFactory.newInstance().newXPath(); 
Element root = doc.getDocumentElement(); 
NodeList nl = root.getChildNodes(); 
ArrayList<String> tempData = new ArrayList<String>(); 

for (int i=0; i < nl.getLength() ; i++) { 
    Node n = nl.item(i); 
    if (n.getNodeType() == Node.ELEMENT_NODE) { 
    NodeList current = n.getChildNodes(); 
    for (int j = 0; j < current.getLength(); j++) { 
     tempData.add(current.item(j).getTextContent().trim()); 
     System.out.println(current.item(j).getTextContent().trim() + " - str to note every output line"); 
    } 
    xmlData.add(tempData); 
    tempData.clear(); 
    } 
} 

을하지만 결과는 다음과 같습니다

000/F/ZZZ/2001 - str to note every output line 
2001-01-01 - str to note every output line 
- str to note every output line 
USD - str to note every output line 
- str to note every output line 
1 - str to note every output line 
- str to note every output line 
EUR - str to note every output line 
- str to note every output line 

왜 빈 줄이 있습니까? 내 코드에 무슨 문제가 있습니까? 더 많은, System.out.println (current.getLength()) 날 9, 왜 9, 4가 있어야합니다 ... 고마워.

답변

0

두 번째 for 루프에서 각 노드을 반복하면서 요소 노드인지 여부를 감지하지 못합니다. <someval> 요소 전후에 4 개의 요소 노드 + 5 개의 텍스트 노드 (공백 - 탭, 공백 및 줄 바꿈 포함)를 계산하므로 노드가 9 개가됩니다. 당신은 단지 요소 노드를 필터링 할 경우 이전에했던 것처럼

는, 당신은 그 루프에서 현재 노드의 유형을 테스트해야합니다 : 이제

for (int j = 0; j < current.getLength(); j++) { 
    if (current.item(j).getNodeType() == Node.ELEMENT_NODE) { // add this! 
     tempData.add(current.item(j).getTextContent().trim()); 
     System.out.println(current.item(j).getTextContent().trim() + " - str to note every output line"); 
    } 
} 

이가 더 이상 인쇄 빈 줄과 루프는 각 <position> 요소에 대해 네 번 반복됩니다.

+0

감사합니다. 그리고 그 XML 파일에 대해 제 코드가 무엇이 좋을까요? – Gwalk

+0

그것은 데이터로 무엇을하고 싶은가에 달려 있습니다. 특정 노드에서 데이터를 추출하기 만하면 XPath에서 더 간단해질 수 있습니다. JDOM이나 DOM4J와 같은 덜 관료적 인 DOM API 나 getElementsByTagName()과 같은 요소를 리턴하는 DOM 메소드를 사용할 수도있다. – helderdarocha

+0

몇 가지 유형의 .xml 파일 (노드가 3-5 개)이 있습니다. List에 저장 한 후에 결과 목록을 사용하여 표를 채 웁니다. Algorythm은 보편적이어야합니다. 왜냐하면 서로 다른 노드 이름과 노드 수가 있기 때문입니다 (말한대로) – Gwalk