2014-04-15 2 views
1

구문 분석하려고하는 XML이 있습니다.SAX를 사용하여 XML 구문 분석에 문제가 발생했습니다.

<Tests> 
    <Test> 
    <Blocks> 
     <Block> 
      <BlockId>2</BlockId> 
      <Name>CCCC</Name> 
      <Type>Action</Type> 
      <TaskId>2</TaskId> 
      <Send> 
       <WId>284</WId> 
       <BlockId>14</BlockId> 
      </Send> 
     </Block> 
     <Block> 
      <BlockId>10</BlockId> 
      <Name>START VM4</Name> 
      <Type>Action</Type> 
      <TaskId>10</TaskId> 
      <Send /> 
     </Block> 
     <Block> 
      <BlockId>12</BlockId> 
      <Name>SHUT</Name> 
      <Type>Action</Type> 
      <TaskId>12</TaskId> 
      <Send /> 
     </Block> 
    </Blocks> 
</Tests> 
</Test> 

저는 이것을 분석하기 위해 SAX를 사용하고 있습니다. 모든 것이 잘 작동하지만 루프가 끝날 때마다 id 2를 가진 블록을 얻은 다음 blockid 10과 12를 가진 또 다른 블록을 얻어야합니다. 그리고 나서이 모든 블록을 테스트에 추가합니다. ...

public void startElement(String uri, String localName, String qName, 
     Attributes attributes) throws SAXException { 
    nqName = qName; 
    tag_name_List.setElementAt(nqName, level); 
    level = level + 1; 

} 

public void endElement(String uri, String localName, 
     String qName) throws SAXException { 
    level = level - 1; 
    tag_name_List.removeElementAt(level); 
} 

public void characters(char ch[], int start, int length) throws SAXException { 

    if (level != 0) { 
     ////////////////Some code 
    } else if (level == 5 
      && tag_name_List.elementAt(1).equals("Test") 
      && tag_name_List.elementAt(2).equals("Blocks") 
      && tag_name_List.elementAt(3).equals("Block") 
      && (nqName.equalsIgnoreCase("BlockId"))) { 
     block = new Block(); 
     test.addBlock(block); 
     block.setId(new String(ch, start, length)); 
     block.setWorkflowId(workflow.getId()); 

    } else if (level == 5 && ...) { 
     ////// Code continues 

NB이 그래서 그냥 부분적으로 공유하는 거대한 XML 거대한 코드입니다

그러나 문제는 여기에 있습니다 : : 내 코드의

부분이다

  • 처음으로 id2,
  • , "\n "
  • ,451,515,
  • 다시 id10 같은
  • 하고 "\n "
  • 다음 id12
  • 하고 "\n ".

이유는 무엇입니까? "\n ".

는 그 실체를 피하기 위해 if 조건을 넣을 수 있습니다,하지만 난 그렇게 할 경우 나는 나중에 "\n "id과 관련된 가도록 id에 부착 된 몇 가지 정보를 잃게됩니다.

누구나이 문제에 직면하여 포인터를 줄 수 있습니까?

추가 정보가 필요한 경우 알려주십시오. 여기에서 다음 행에 대한 \r"\n "있을 것이므로

난 해당하는 결과 코드를 디버깅 한 결과, 기본적

<BlockId>14</BlockId> 

끝에서 "\n "를 취하고있다.

어떻게 피할 수 있습니까?

+0

SAX 처리기 구현을 추가하십시오. – helderdarocha

+0

XML의 크기는 얼마입니까? 2GB 미만인 경우 다른 옵션은 vtd-xml을 사용하는 것입니다 ... 고대 API 인 SAX에 비해 vtd-xml은 최신 기술입니다. –

답변

0

nqName = qName을 지정합니다. 다음 반복 때까지 그 값을 변경 한 적이 있습니까? 당신이 BlockId 요소의 문맥을 떠날 때 그 값을 변경하지 않으면 외부 요소 를하지만 아직 Name 내부, 예를 들어 때

, 그것은 여전히BlockId와 동일합니다. 그리고 characters() 메서드는 모두으로 읽습니다.

endElement()nqName을 재설정해야합니다.귀하의 endElement() 방법에

nqName = null; 

을 추가하십시오.

+0

Perfect. 이것은 내 문제를 해결했다. 엄청 고마워. – user3491492

관련 문제