Добавление элементов и атрибутов XML - PullRequest
2 голосов
/ 18 ноября 2010

У меня есть следующая структура XML, чтобы я мог добавить свои данные конфигурации к последнему подключенному элементу:

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

Теперь я хочу сделать некоторую операцию XML, такую ​​как добавление элементов и атрибутов. Например, я хочу добавить элементы в XML выше: (Внутри elemet lastconnectedServers):

<Server ip="" domain="">
        <SharedFolder name="" type=""/>
        <SharedFolder name="" type =""/>
        <SharedFolder name="" type =""/>
</Server> 

так что полученный XML будет выглядеть примерно так:

<?xml version="1.0" encoding="utf-8" ?>
<lastconnectedServers>
   <Server ip="" domain="">
        <SharedFolder name="" type=""/>
        <SharedFolder name="" type =""/>
        <SharedFolder name="" type =""/>
   </Server>
</lastconnectedServers >

Ответы [ 2 ]

3 голосов
/ 21 ноября 2010

Вот пример кода с использованием MSXML.Проверка ошибок COM не указана.Код выглядит немного многословно из-за помощников ATL для использования COM, но модель программирования следует API-интерфейсам W3C DOM, что вполне приемлемо для разработчиков XML.

CComPtr<IXMLDOMDocument2> spDoc;
CComPtr<IXMLDOMElement> spServerElement, spSharedFolderElement;
CComPtr<IXMLDOMNode> spServerNode, spLastConnectedServerNode;
IXMLDOMNode* pInsertedNode;
VARIANT_BOOL varSucc;
CComBSTR bstrLastConnected = L"<?xml version=\"1.0\" encoding=\"utf-8\" ?> \
                               <lastconnectedServers> \
                               </lastconnectedServers >";

spDoc.CoCreateInstance(CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER);
spDoc->put_async(VARIANT_FALSE);
spDoc->loadXML(bstrLastConnected, &varSucc);

// Finds the lastConnectedServerNode node with XPath.
spDoc->selectSingleNode(CComBSTR(L"/lastconnectedServers"),
    &spLastConnectedServerNode);

// Creates and appends Server node.
spDoc->createElement(CComBSTR(L"Server"), &spServerElement);
spServerElement->setAttribute(CComBSTR(L"ip"), CComVariant(L""));
spServerElement->setAttribute(CComBSTR(L"domain"), CComVariant(L""));
spLastConnectedServerNode->appendChild(spServerElement, &pInsertedNode);

// Creates and appends the first SharedFolder elements.
spDoc->createElement(CComBSTR(L"SharedFolder"), &spSharedFolderElement);
spSharedFolderElement->setAttribute(CComBSTR(L"name"), CComVariant(L""));
spSharedFolderElement->setAttribute(CComBSTR(L"type"), CComVariant(L""));
spServerElement->appendChild(spSharedFolderElement, &pInsertedNode);

// Creates the second and third SharedFolder elements...

// Gets the xml content.
CComBSTR bstrXml;
spDoc->get_xml(&bstrXml);

wprintf(L"%s", (LPCWSTR) bstrXml);

Надеюсь, это поможет.

2 голосов
/ 19 ноября 2010
TiXmlDocument doc("YourFile.xml");
bool loadOkay = doc.LoadFile();

if(loadOkay)
{
    //Variables for XML elements and attributes
    TiXmlElement *pRoot;
    //Get root element
    pRoot = doc.RootElement();
            TiXmlElement * server = new TiXmlElement("Server"); // Create the new child element
            server->LinkEndChild(pRoot);//Links the child to the parent
            server->setAttribute("ip", ""); // Set attributes
            server-setAttribute("domain","");
            foeach(/*Your Data as Value*/)
            {
                TiXmlElement * sharedFolder = new TiXmlElement("SharedFolder");
                server->LinkEndChild(sharedFolder);
                server->setAttribute("name", "");
                server-setAttribute("type","");  
            }


}
if( doc.SaveFile( "YourOutput.xml" ))
{
    return true;
}
else
{
    return false;
}

Это должно позволить вам добавлять новых дочерних элементов к корневому элементу и является базовой структурой для этого.Вы можете найти больше информации о TinxyXML и о том, как его использовать здесь

...