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);
}
我有下面的例子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);
}