Poco c++ Library 之xml 的使用

您所在的位置:网站首页 poco怎么读 Poco c++ Library 之xml 的使用

Poco c++ Library 之xml 的使用

2024-07-14 07:23| 来源: 网络整理| 查看: 265

POCO XML 操作文档 

它操作xml 有两种方式, sax 和dom, 这时只介绍DOM , 注意 dom 元素有限制, 子节点下不同名的元素不能超过251个.

注: poco xml 只支持utf8 所以你的所有字符串都必须先转换成 utf8 才能使用.

读XML : 我们得先清楚几个问题: 1 我这里只介绍 DOMParser DOMWriter. 2 POCO 的思想 它把,Element,attribute 都看作是节点.  如何打开一个文件? 方法1:直接传路径 DOMParser parser; AutoPtr pDoc ; pDoc = parser.parse("SC_PhoneInfo.xml");//这里可以传文件路径进去 把pDoc记住后面会用到 这里我们调用的是它个这个构造函数: Document* DOMParser::parse(const XMLString& uri); 方法2:用标准库中的流(这个没测试,按理说应该可以,因为我测试过写的) std::ifstream file; file.open("text1.xml",) pDoc = parser.parse(file); 遍历结点: NodeIterator it(pDoc, NodeFilter::SHOW_ALL); Node* pNode = it.nextNode(); while (pNode) { std::cout nodeName() createElement("Root");   AutoPtr myChild = pDoc->createElement("Child");   AutoPtr myGrandChild = pDoc->createElement("GrandChild");   AutoPtr nameNode = pDoc->createTextNode("my_name_is_xiaoqiang");   AutoPtr pi = pDoc->createProcessingInstruction("xml","version='1.0' encoding='UTF-8'" );   AutoPtr comm = pDoc->createComment("new_day");   myGrandChild->appendChild(nameNode);   myChild->appendChild(myGrandChild);   myRoot->appendChild(myChild);   pDoc->appendChild(pi);   pDoc->appendChild(comm);

  pDoc->appendChild(myRoot);

Poco::XML::DOMWriter writer;   writer.setOptions(Poco::XML::XMLWriter::PRETTY_PRINT);   writer.writeNode(std::cout,pDoc);

方法2: 用流. 增加结点: AutoPtr pDoc = new Document; AutoPtr pRoot = pDoc->createElement("Phone"); pDoc->appendChild(pRoot); AutoPtr pChild1 = pDoc->createElement("CallLog");

pRoot->appendChild(pChild1);//子结点

//如果还想插入孙结点就

pChild1->appendChild(XXXX);

//孙结点上.. XXXX->appendChild(YYY); 很简单了就像树一样一层一层的住上插就可以了. 如果要添加设置几个属性节点怎么办? //测试代码会有内存泄漏. 要用智能指针. Document* pDoc = new Document; AutoPtr pRoot = pDoc->createElement("Phone");

Element* pChild = pDoc->createElement("Log");

方法1:

pChild ->setAttribute("flux",flux);

方法2: Attr *pAttr  = pDoc->createAttribute("ss");  //属性节点名称 ss pAttr->setNodeValue("111");//属性节点名称 ss 的值 111

pChild->setAttributeNode(pAttr); //添加到指定的结点上

Attr *pAttr1  = pDoc->createAttribute("ss3");//属性节点名称 ss

pAttr1->setNodeValue("11331");//属性节点名称 ss3的值 11331 pChild->setAttributeNode(pAttr1);//添加到指定的结点上 //插入到指定的结点上 pRoot->appendChild(pChild); pDoc->appendChild(pRoot); 如果你想在查找到的结点上增加内容可以这样: Poco::XML::Node* pNode =  pDoc->getNodeByPath(strPath); //查找到结点 Poco::AutoPtr pElem = pDoc->createElement("site"); // 创建结点 pNode->appendChild(pElem); // 插入它 这个参数是Node 但是因为Element继承于它所以可以使用. 111  ///111 也算是item的子结点,但它的类型是#text. 并不是所的xml 类中的指针加AutoPtr 都行 像创建类的加上我目前没发现问题. 如是返回指针就不要加了.加了会出错. Poco::XML::Node* pNode =  pDoc->getNodeByPath(strPath);  //正确 Poco::AutoPtr pNode =  pDoc->getNodeByPath(strPath); //错误. Poco::AutoPtr pElemdate = pDoc->createElement("date"); // 正确 Poco::AutoPtr pText = pDoc->createTextNode(strData); //正确


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3