2014-07-11 5 views
0

저는 C++ 프로그램에서 사용하고 싶은 일부 변수를 포함하고있는 XML 파일을 분석하기 위해 RapidXML을 사용하고 있습니다. 나는 유효한 노드를 읽으려고 애를 먹었지 만 노드 이름의 철자가 틀린 경우 오류 처리를 추가하고 싶습니다.RapidXML 노드 예외 처리

다음은 내 파일의 작동 예제입니다.

통화 당

try 
{ 
    rapidxml::file<> xmlFile("file.xml"); 
    rapidxml::xml_document<> doc; 
    doc.parse<parse_declaration_node | parse_no_data_nodes>(xmlFile.data()); 

    xml_node<>* prop_node = doc.first_node("PropertyList"); 
} 
catch (const runtime_error& e) 
{ 
    // Do something 
} 
catch (const rapidxml::parse_error& e) 
{ 
    // Do something 
} 
catch (const exception& e) 
{ 
    // Do something 
} 
catch(...) 
{ 
    // Do something 
} 

.XML

<?xml version="1.0" encoding="utf-8"?> 

<PropertyList> 
    ... 
</PropertyList> 

나는 그러나, 존재과 같이하지 않는 노드에 내 .cpp 파일에서 first_node() 전화를 변경하는 경우 :

xml_node<>* prop_node = doc.first_node("Property"); 

예외를 throw하는 대신 잘못된 메모리 액세스에 대해 불평하는 런타임에 프로그램이 충돌했습니다.

RapidXML이 작동하는 방식입니까, 아니면 제가 잘못 했나요?

감사합니다.

답변

0

전 RapidXML에 익숙하지 않지만 참조 페이지에서 first_node에 대한 다음 내용을 발견했습니다. http://rapidxml.sourceforge.net/manual.html#namespacerapidxml_1what_is_rapidxml

함수 xml_node :: first_node

시놉시스

xml_node first_node * (* CONST 편 이름 = 0, 표준 :이 size_t name_size = 0 BOOL CASE_SENSITIVE = TRUE) CONST; 설명

선택적으로 노드 이름과 일치하는 첫 번째 자식 노드를 가져옵니다. 매개 변수

이름 찾을 자식 이름 또는 에 관계없이 첫 번째 자식을 반환하는 데 0; name_size 가 비교는 대소 문자를 구별 할 이름을해야 문자열 CASE_SENSITIVE에서 자동으로 계산 크기 을 가지고, 이름의 비 - 제로 name_size 크기입니다 문자, 또는 0 경우이 문자열은 제로가 종료 할 필요가 없습니다; 비 대소 문자를 구분 비교는 ASCII 문자 만 제대로 작동 발견되지 않는 경우는

발견 아이의 포인터, 또는 0을 돌려줍니다.

그래서 당신은 (이 문제에 대한 직접적인 답변을하지 않을 수 있습니다.). 이름을 지정하지 않고도

을 first_node 전화 또는 확인 할 수 있습니다 경우 doc.first_node의 반환 값 ("속성 ")는 0입니다. 반환 값이 0이 아닌 경우 prop_node에만 값을 할당하십시오.

+0

답장을 보내 주셔서 감사합니다. 내가 first_node()의 응답이 0인지 아닌지 먼저 확인하여 작업을 시작하도록했습니다. 잘 작동하는 것 같습니다! – nbon