구문 분석하려고하는 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 거대한 코드입니다
그러나 문제는 여기에 있습니다 : : 내 코드의
부분이다
- 처음으로
id
을2
, - ,
"\n "
,451,515,
- 다시
id
10
같은 - 하고
"\n "
- 다음
id
12
- 하고
"\n "
.
이유는 무엇입니까? "\n "
.
는 그 실체를 피하기 위해 if
조건을 넣을 수 있습니다,하지만 난 그렇게 할 경우 나는 나중에 "\n "
id
과 관련된 가도록 id
에 부착 된 몇 가지 정보를 잃게됩니다.
누구나이 문제에 직면하여 포인터를 줄 수 있습니까?
추가 정보가 필요한 경우 알려주십시오. 여기에서 다음 행에 대한 \r
와 "\n "
있을 것이므로
난 해당하는 결과 코드를 디버깅 한 결과, 기본적
<BlockId>14</BlockId>
끝에서 "\n "
를 취하고있다.
어떻게 피할 수 있습니까?
SAX 처리기 구현을 추가하십시오. – helderdarocha
XML의 크기는 얼마입니까? 2GB 미만인 경우 다른 옵션은 vtd-xml을 사용하는 것입니다 ... 고대 API 인 SAX에 비해 vtd-xml은 최신 기술입니다. –