TinyXML2 - 在XML中间插入元素

时间:2014-07-18 10:15:29

标签: c++ xml tinyxml

我希望在XML结构的中间添加包含数据的新元素。如何将它们附加到我需要的地方?

当前代码:

XMLElement *node = doc.NewElement("timeStamp");
XMLText *text = doc.NewText("new time data");
node->LinkEndChild(text);
doc.FirstChildElement("homeML")->FirstChildElement("mobileDevice")->FirstChildElement("event")->LinkEndChild(node);
doc.SaveFile("homeML.xml"); 

我的XML结构的一个示例部分:

<mobileDevice>
    <mDeviceID/>
    <deviceDescription/>
    <units/>
    <devicePlacement/>
    <quantisationResolution/>
    <realTimeInformation>
        <runID/>
        <sampleRate/>
        <startTimeStamp/>
        <endTimeStamp/>
        <data/>
    </realTimeInformation>
    <event>
        <mEventID/>
        <timeStamp/>
        <data/>
        <support/>
    </event>
</mobileDevice>

我希望在timeStampmobileDevice->event之间的mEventID下添加额外的data标记,此时它们会在support之后添加标签如何让它们输入到正确的位置?

运行时的当前展示位置:

<mobileDevice>
    <mDeviceID/>
    <deviceDescription/>
    <units/>
    <devicePlacement/>
    <quantisationResolution/>
    <realTimeInformation>
        <runID/>
        <sampleRate/>
        <startTimeStamp/>
        <endTimeStamp/>
        <data/>
    </realTimeInformation>
    <event>
        <mEventID/>
        <timeStamp/>
        <data/>
        <support/>
        <timeStamp>new time data</timeStamp>
    </event>
</mobileDevice>

1 个答案:

答案 0 :(得分:3)

您想使用InsertAfterChild()来执行此操作。这是一个应该做你想做的事情的例子(假设&#34; mobileDevice&#34;是你的文件的根元素):

// Get the 'root' node
XMLElement * pRoot = doc.FirstChildElement("mobileDevice");

// Get the 'event' node
XMLElement * pEvent = pRoot->FirstChildElement("event");

// This is to store the element after which we will insert the new 'timeStamp'
XMLElement * pPrecedent = nullptr;

// Get the _first_ location immediately before where
//     a 'timeStamp' element should be placed
XMLElement * pIter = pEvent->FirstChildElement("mEventID");

// Loop through children of 'event' & find the last 'timeStamp' element
while (pIter != nullptr)
{
    // Store pIter as the best known location for the new 'timeStamp'
    pPrecedent = pIter;

    // Attempt to find the next 'timeStamp' element
    pIter = pIter->NextSiblingElement("timeStamp");
}

if (pPrecedent != nullptr)
{
    // Build your new 'timeStamp' element,
    XMLElement * pNewTimeStamp = xmlDoc.NewElement("timeStamp");
    pNewTimeStamp->SetText("Your data here");

    // ..and insert it to the event element like this:
    pEvent->InsertAfterChild(pPrecedent, pNewTimeStamp);
}

这是一个有趣且可能是常见的用例。几个月前我写了TinyXML2 tutorial,所以我将其添加到其中。