0

以前にファイルを書き出したXMLノードのコンテンツの文字列を読みたいだけです。コードは次のとおりです。

int main() {

xmlNodePtr n, n2, n3;
xmlDocPtr doc;
xmlChar *xmlbuff;
int buffersize;
xmlChar* key;

doc = xmlNewDoc(BAD_CAST "1.0");
n = xmlNewNode(NULL, BAD_CAST "root");


xmlNodeSetContent(n, BAD_CAST "test1");
n2 = xmlNewNode(NULL, BAD_CAST "devices");
xmlNodeSetContent(n2, BAD_CAST "test2");
n3 = xmlNewNode(NULL, BAD_CAST "device");
xmlNodeSetContent(n3, BAD_CAST "test3");

//n2 = xmlDocCopyNode(n2, doc, 1);
xmlAddChild(n2,n3);
xmlAddChild(n,n2);


xmlDocSetRootElement(doc, n);


xmlSaveFormatFileEnc( FILENAME, doc, "utf-8", 1 );

doc = xmlParseFile(FILENAME);
n = xmlDocGetRootElement(doc);

key = xmlNodeListGetString(doc, n, 1);
printf("keyword: %s\n", key);
xmlFree(key);

n = n->children;

key = xmlNodeListGetString(doc, n, 1);
printf("keyword: %s\n", key);
xmlFree(key);

n = n->children;

key = xmlNodeListGetString(doc, n, 1);
printf("keyword: %s\n", key);
xmlFree(key);

n2 = xmlNewNode(NULL, BAD_CAST "address");
xmlAddChild(n,n2);

xmlDocSetRootElement(doc, n);

xmlSaveFormatFileEnc( FILENAME, doc, "utf-8", 1 );

return 0;
}

このコードの出力は->キーワード:(null)キーワード:test1キーワード:(null)

test2とtest3が読めないのはなぜですか?

前もって感謝します。

4

1 に答える 1

1

生成する XML ファイルは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<root>
    test1
    <devices>
        test2
        <device>
            test3
        </device>
    </devices>
</root>

libxml では、子にはテキスト ノードと要素の両方が含まれます。ノードが何を指しているかを知るには、type フィールドを確認する必要があります。

使用できるコードは次のとおりです (これを行うためのより良い方法があると確信していますが、実行する必要がある型テストを明確に示しています)。要素ノードに n を使用し、テキスト ノードの検索に n2 を使用しています。

// Get <root>    
n = xmlDocGetRootElement(doc);
n2 = n -> children;
while (n2 != NULL && n2 -> type != XML_TEXT_NODE)
    n2 = n2 -> next;
if (n2 != NULL)
{
   key = xmlNodeListGetString(doc, n2, 1);
   printf("keyword: %s\n", key);
   xmlFree(key);
}

// grab child
n = n -> children;
while (n != NULL && n -> type != XML_ELEMENT_NODE)
    n = n -> next;
if (n == NULL)
    return -1;

// grab its 1st text child       
n2 = n -> children;
while (n2 != NULL && n2 -> type != XML_TEXT_NODE)
    n2 = n2 -> next;
if (n2 != NULL)
{
   key = xmlNodeListGetString(doc, n2, 1);
   printf("keyword: %s\n", key);
   xmlFree(key);
}

// grab child
n = n -> children;
while (n != NULL && n -> type != XML_ELEMENT_NODE)
    n = n -> next;
if (n == NULL)
    return -1;

// grab its 1st text child       
n2 = n -> children;
while (n2 != NULL && n2 -> type != XML_TEXT_NODE)
    n2 = n2 -> next;
if (n2 != NULL)
{
   key = xmlNodeListGetString(doc, n2, 1);
   printf("keyword: %s\n", key);
   xmlFree(key);
}
于 2012-07-09T12:06:20.617 に答える