2013-07-16 2 views
2

PC의 VS2012에서 rapidXML 및 C++을 사용하고 있습니다. 이미 XML 파일을 구문 분석했지만 속성 값을 개별적으로 인쇄하려고합니다. 일반적으로 아래 코드를 사용하여이 작업을 수행 할 수 있습니다. 그러나이 f}은 노드 이름 W 속성 이름을 알아야합니다. 동일한 이름을 가진 노드가 여러 개 있고 이름이 같은 여러 속성이 있기 때문에 문제가됩니다. 내 질문은 이것입니다, 노드 이름도 속성 이름도 고유하지 않을 때 단일 속성 값을 얻으려면 어떻게해야합니까?RapidXML 이전 속성 값을 사용하여 개별 속성 값에 액세스 하시겠습니까?

나는 고유 한 노드 이름을 가지고 및 속성 때 내가 사용하는 코드 명 :

xml_node<> *node0 = doc.first_node("NodeName"); //define the individual node you want to access 
xml_attribute<> *attr = node0->first_attribute("price"); //define the individual attribute that you want to access 
cout << "Node NodeName has attribute " << attr->name() << " "; 
cout << "with value " << attr->value() << "\n"; 

내 XML 테스트 파일이 특정 예를 들어

<catalog> 
    <book> 
     <author>Gambardella, Matthew</author> 
     <title>XML Developer's Guide</title> 
     <price>44.95</price> 
    </book> 
    <book> 
    <author>Ralls, Kim</author> 
    <title>Midnight Rain</title> 
    <price>5.95</price> 
    </book> 
</catalog> 

, 내가의 가치를 얻을 수있는 방법 두 번째 책의 가격 속성? 제목 속성 값 "Midnight Rain"을 입력하고 어떻게해서 그것을 사용하여 다음 값을 얻을 수 있습니까?

+1

'price'는 속성이 아니며 노드입니다. XML 속성은 다음과 같습니다.'' – Roddy

답변

1

next_sibling(const char *) 멤버 함수를 사용하면 형제 노드를 반복 할 수 있으며 올바른 특성 값을 가진 노드를 찾을 수 있습니다. 나는 다음과 같은 코드를 테스트하지 않은,하지만 당신이해야 할 일의 아이디어를 제공해야합니다 :

typedef rapidxml::xml_node<>  node_type; 
typedef rapidxml::xml_attribute<> attribute_type; 

/// find a child of a specific type for which the given attribute has 
/// the given value... 
node_type *find_child( 
    node_type *parent, 
    const std::string &type, 
    const std::string &attribute, 
    const std::string &value) 
{ 
    node_type *node = parent->first_node(type.c_str()); 
    while (node) 
    { 
     attribute_type *attr = node->first_attribute(attribute.c_str()); 
     if (attr && value == attr->value()) return node; 
     node = node->next_sibling(type.c_str()); 
    } 
    return node; 
} 

그런 다음 두 번째 책을 찾을 수있는 호출하여 :

node_type *midnight = find_child(doc, "book", "title", "Midnight Rain"); 

을의 가격을 받기를 그 책은 쉬워야합니다.

일반적으로 rapidxml을 다룰 때는 이러한 작은 도우미 기능을 많이 생성하는 경향이 있습니다. 나는 그들이 xpath 함수가 없으면 코드를 읽기 쉽게 만든다.

+0

node_type이 "모호한 심볼"이기 때문에 코드가 실행되지 않고 있습니다. node_type이하려고하는 것을 완전히 이해하지 못합니다. 코드에 대해 더 쉽게 주석을 달거나 직접 테스트 할 수 있다고 생각하십니까? 이 문제가 명백해 보인다면 사과드립니다. rapidxml을 처음 사용하는 것입니다. –

+0

분명히, 당신의 환경에는 이미 'node_type'이라는 심볼이 있습니다. 위의 코드에서 node_type을 xml_node <>로 바꿀 수 있습니다. 그것이 삽화에 지나지 않습니다. 핵심 메시지는 위의 예제와 같이 use next_sibling (const char *)입니다. – dhavenith

0

같은 이름과 여러 속성이 같은 이름의 여러 노드를 말하면, 다중 노드와 다중,, 속성? 그렇다면 여러 xml 메시지를 전달하려고합니다. 그러나 첫 xml 메시지를 먼저 전달한 다음 두 번째 메시지를 성공적으로 전달할 수 있어야합니다. 전체 코드를 포함시키지 않았다면 먼저 doc.first_node 메소드가 실제로 xml_node를 생성하는지 확인합니다.

관련 문제