6

xmlファイルのデータをエンコードするためにLibxml2を使用しています。私のデータには「<」や「>」などのタグが含まれています。xmlに変換されると、これらのタグも「&lt」と「&gt」に変換されます。この問題を解決する方法はありますか?そのxmlファイルをデコードするときにこれらのタグをxmlノードとして使用したいので、CDATAはこの問題の解決策ではありません。これに対する解決策を教えてください。ありがとう。

サンプルコード:

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>
4

4 に答える 4

3

文字列を xml として扱いたい場合は、 xmlReadMemoryxmlDocを使用して、文字列を解析して取得する必要があります。より大きな文字列に使用できる可能性がありますが、通常、ドキュメントは Joachim の回答のように、単一のステップの指示を使用して作成されます。ここでは、文字列の方法で処理を行う関数を示します。xmlAddChildFromString

#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;
  }
  newNode->children = NULL; // Thanks to milaniez
  newNode->last = NULL;     // for fixing
  xmlFreeNode(newNode);     // the memory leak.
  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);
}
于 2012-10-17T06:47:54.267 に答える
2

チェーンで呼び出すxmlNewChild必要があります。親ノードに対して 1 つの呼び出しと、各サブノードに対してそれぞれ呼び出しを行います。

xmlNodePtr *addressNode = xmlNewChild(node, NULL, (xmlChar *) "address", NULL);
xmlNewChild(addressNode, NULL, (xmlChar *) "street", "Park Street");
xmlNewChild(addressNode, NULL, (xmlChar *) "city", "Koltaka");
于 2012-10-17T06:42:50.653 に答える
2

関数 xmlParseInNodeContext の使用を試みることができます。親ノードのコンテキストで未加工の XML を解析し、親にアタッチできるノードを構築できます。

例えば:

const char * xml = "<a><b><c>blah</c></b></a>";
xmlNodePtr new_node = NULL;

// we assume that 'parent' node is already defined
xmlParseInNodeContext(parent, xml, strlen(xml), 0, &new_node);
if (new_node) xmlAddChild(parent, new_node);
于 2013-10-17T23:54:56.120 に答える