Poco c++ Library 之xml 的使用 |
您所在的位置:网站首页 › poco怎么读 › Poco c++ Library 之xml 的使用 |
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 |