如何添加在libxml2的字符串构造的XML节点 [英] How to add a xml node constructed from string in libxml2

查看:1086
本文介绍了如何添加在libxml2的字符串构造的XML节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的libxml2在一个XML文件中的数据进行编码。我的数据包含类似的标记<和>。当它被转换成的XML这些标签也被转换成与&下和与& GT。有没有什么办法可以解决这个问题。我想用这些标签的XML节点解码时的XML文件,所以CDATA是不是这个问题的解决方案。请给这个任何解决方案。谢谢。

举例code:

  xmlNewChild(节点,NULL,(XMLCHAR *)地址(XMLCHAR *)<街道>公园街道< /街道><城市>加尔各答< /城市> );以上code的输出是:
<&人GT;
<地址>&放大器; LT;街道和放大器; GT;公园街和放大器; LT; /街道和放大器; GT;&放大器; LT;城市和放大器; GT;加尔各答和放大器; LT; /城市和放大器; GT;< /地址>


解决方案

如果你想有一个字符串被当作XML,那么你应该分析它,并从获得 xmlDoc中它,使用 xmlReadMemory 。这可能是较大的字符串使用,但通常该文件是使用单步说明,就像勒夫的回答建造。在这里,我present xmlAddChildFromString 函数来完成的东西在一个字符串的方法。

 的#include<&stdio.h中GT;
#包括LT&;&string.h中GT;
#包括LT&;的libxml / parser.h>
#包括LT&;的libxml / tree.h中>///返回0失败,否则为1
INT xmlAddChildFromString(父母的xmlNodePtr,XMLCHAR * newNodeStr)
{
  INT RV = 0;
  XMLCHAR * newNodeStrWrapped =释放calloc(strlen的(newNodeStr)+ 10,1);
  如果(newNodeStrWrapped!)返回0;
  的strcat(newNodeStrWrapped,&所述a取代;);
  strcat的(newNodeStrWrapped,newNodeStr);
  的strcat(newNodeStrWrapped,&所述; / A>中);
  xmlDocPtr newDoc = xmlReadMemory(
    newNodeStrWrapped,strlen的(newNodeStrWrapped)
    NULL,NULL,0);
  免费(newNodeStrWrapped);
  如果返回0(newDoc!);
  的xmlNodePtr newNode = xmlDocCopyNode(
    xmlDocGetRootElement(newDoc)
    父 - > DOC,
    1);
  xmlFreeDoc释放(newDoc);
  如果(newNode!)返回0;
  的xmlNodePtr addedNode = xmlAddChildList(父母,newNode->儿童);
  如果(!addedNode){
    xmlFreeNode(newNode);
    返回0;
  }
  返回1;
}INT
主(INT ARGC,字符** argv的)
{
    xmlDocPtr DOC = xmlNewDoc(BAD_CAST1.0);
    的xmlNodePtr根= xmlNewNode(NULL,BAD_CAST根);
    xmlDocSetRootElement(DOC,根);
    xmlAddChildFromString(根,
      <街道>公园街道< /街道><城市>&加尔各答LT; /城市>);
    xmlDocDump(标准输出,DOC);
    xmlFreeDoc释放(DOC);
    返回(0);
}

I am using Libxml2 for encoding the data in a xml file. My data contain tags like "<" and ">". when it is converted into xml these tags are also converted into "&lt" and "&gt". Is there any way to solve this problem. I want to use those tags as xml nodes while decoding that xml file, so CDATA is not a solution for this problem. Please give any solution for this. Thanks.

Example Code:

xmlNewChild(node, NULL, (xmlChar *)"ADDRESS", (xmlChar *)"<street>Park Street</street><city>kolkata</city>");

and output of above code is:
<person>
<ADDRESS>&lt;street&gt;Park Street&lt;/street&gt;&lt;city&gt;Kolkata&lt;/city&gt;</ADDRESS>

解决方案

If you want a string to be treated as xml, then you should parse it and obtain xmlDoc from it, using xmlReadMemory. It could be usable for larger strings, but usually the document is builded using single step instructions, like in Joachim's answer. Here I present xmlAddChildFromString function to do the stuff in a string way.

#include <stdio.h>
#include <string.h>
#include <libxml/parser.h>
#include <libxml/tree.h>

/// Returns 0 on failure, 1 otherwise
int xmlAddChildFromString(xmlNodePtr parent, xmlChar *newNodeStr)
{
  int rv = 0;
  xmlChar *newNodeStrWrapped = calloc(strlen(newNodeStr) + 10, 1);
  if (!newNodeStrWrapped) return 0;
  strcat(newNodeStrWrapped, "<a>");
  strcat(newNodeStrWrapped, newNodeStr);
  strcat(newNodeStrWrapped, "</a>");
  xmlDocPtr newDoc = xmlReadMemory(
    newNodeStrWrapped, strlen(newNodeStrWrapped),
    NULL, NULL, 0);
  free(newNodeStrWrapped);
  if (!newDoc) return 0;
  xmlNodePtr newNode = xmlDocCopyNode(
    xmlDocGetRootElement(newDoc),
    parent->doc,
    1);
  xmlFreeDoc(newDoc);
  if (!newNode) return 0;
  xmlNodePtr addedNode = xmlAddChildList(parent, newNode->children);
  if (!addedNode) {
    xmlFreeNode(newNode);
    return 0;
  }
  return 1;
}

int
main(int argc, char **argv)
{
    xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0");
    xmlNodePtr root = xmlNewNode(NULL, BAD_CAST "root");
    xmlDocSetRootElement(doc, root);
    xmlAddChildFromString(root,
      "<street>Park Street</street><city>kolkata</city>");
    xmlDocDump(stdout, doc);
    xmlFreeDoc(doc);
    return(0);
}

这篇关于如何添加在libxml2的字符串构造的XML节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆