как получить только дочерний список узлов, используя getElementByTagName?

У меня есть этот XML-файл, из которого я хочу извлечь дочерние поля сообщений.

<message name="IOI" >
<field number="23" name="IOIID" type="STRING" required="Y" /> 
<field number="28" name="IOITransType" type="CHAR" required="Y" >
    <value enum="C" description="CANCEL" /> 
    <value enum="N" description="NEW" /> 
    <value enum="R" description="REPLACE" /> 
</field>
<field number="26" name="IOIRefID" type="STRING" required="N" /> 
<component name="SecAltIDGrp" required="N" > 
    <field number="454" name="NoSecurityAltID" type="NUMINGROUP" required="N" >
        <field number="455" name="SecurityAltID" type="STRING" required="N" /> 
        <field number="456" name="SecurityAltIDSource" type="STRING" required="N" /> 
        </field>    
</component>

so I used getElementsByTagName() but it gave me all children with their children, so how could I only get my message fields without my fields's fields ??

DOMNodeList* fieldsNodeList = MessageElement->getElementsByTagName(xmlStrVar);

person Joy    schedule 28.05.2012    source источник


Ответы (1)


Xerces C++ обеспечивает частичную реализацию XPath. А вот SO вопрос с более подробной информацией об этом. При этом, в зависимости от версии Xerces C++, которую вы используете, вы сможете запускать простые выражения XPath, такие как /message/field.

Другой вариант — остаться с DOM API и просто перебирать дочерние узлы, используя getChildNodes(), доступный на DOMNode ищет field элементов.

И последнее, но не менее важное: если вам понравилась идея XPath, но ваша версия Xerces C++ не соответствует ей, подумайте о том, чтобы выйти из своей «зоны комфорта» и посмотреть Xalan C++ или libxml2. Оба должны иметь полную поддержку XPath 1.0.

person Pavel Veller    schedule 29.05.2012