Poco XML - 获取节点内部 XML

Poco XML - Get node inner XML

我有下面的例子XML:

 <root>
   <node id="1">
      <value>test</value>
      <value2>test2</value2>
   </node>
   <node id="2">
      <value>test</value>
   </node>
 </root>

如何在 std::string 中获取整个节点 1 XML 的内容?

我试过以下方法:

Poco:XML:Node *node = xmlDocument->getNodeByPath("/root/node[1]");
Poco::XML::XMLString xstr = node->getPocoElement()->innerText;
string str = Poco::XML::fromXMLString(node->getPocoElement()->innerText);

它会 returns 这个:

test \n test2

我需要这个:

   <node id="1">
      <value>test</value>
      <value2>test2</value2>
   </node>

Poco中没有这样的功能,但是你可以用最少的代码创建自己的。 您可以在 documentation 中获得有关 Node 方法的信息。

您需要通过 sub-nodes 将节点名称与具有名称和值的属性串联起来。 对于获取属性,使用方法 attributes.

获取 sub-nodes 使用方法 childNodes.

完整示例:

#include "Poco/DOM/DOMParser.h"
#include "Poco/DOM/Document.h"
#include "Poco/DOM/NodeList.h"
#include "Poco/DOM/NamedNodeMap.h"
#include "Poco/SAX/InputSource.h"
#include <iostream>
#include <fstream>
#include <string>

std::string node_to_string(Poco::XML::Node* &pNode,const std::string &tab);

int main()
{
std::ifstream in("E://test.xml");
Poco::XML::InputSource src(in);
Poco::XML::DOMParser parser;
auto xmlDocument = parser.parse(&src);
auto pNode = xmlDocument->getNodeByPath("/root/node[0]");

std::cout<<node_to_string(pNode,std::string(4,' '))<<std::endl;

return 0;
}

std::string node_to_string(Poco::XML::Node* &pNode,const std::string &tab)
    {
    auto nodeName = pNode->nodeName();

    Poco::XML::XMLString result = "<" + nodeName ;

    auto attributes = pNode->attributes();
    for(auto i = 0; i<attributes->length();i++)
    {
    auto item = attributes->item(i);
    auto name = item->nodeName();
    auto text = item->innerText();
    result += (" " + name + "=\"" + text + "\"");
    }

    result += ">\n";
    attributes->release();

    auto List = pNode->childNodes();
    for(auto i = 0; i<List->length();i++)
    {
    auto item = List->item(i);
    auto type = item->nodeType();
    if(type == Poco::XML::Node::ELEMENT_NODE)
    {
        auto name = item->nodeName();
        auto text = item->innerText();
        result += (tab + "<" + name + ">" + text + "</"+ name + ">\n");
    }

    }
    List->release();
    result += ("</"+ nodeName + ">");
    return Poco::XML::fromXMLString(result);
    }