以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 XML源码及示例(仅原创和转载) 』  (http://bbs.xml.org.cn/list.asp?boardid=32)
----  谁在UNIX下用过libxml2?  (http://bbs.xml.org.cn/dispbbs.asp?boardid=32&rootid=&id=6559)


--  作者:djsone
--  发布时间:4/8/2004 9:02:00 AM

--  谁在UNIX下用过libxml2?
创建属性Attribute时如何支持中文?
--  作者:mlsx
--  发布时间:4/8/2004 10:26:00 AM

--  
本来就支持中文呀,我一直都是在unix下面工作!
--  作者:byronff
--  发布时间:4/8/2004 11:14:00 AM

--  
楼上两位大哥,请教如何使用libxml2?(在unix下),我想用c语言来处理xml文档,请问该怎么办?(我是新手)
万分感谢!
--  作者:djsone
--  发布时间:4/8/2004 5:07:00 PM

--  
从http://www.xmlsoft.org/下载libxml2-2.6.8或其它版本,然后

执行命令
cd libxml2-2.6.8
./configure --prefix=/usr/liu/xml/libxml2    (/usr/liu/xml/libxml2为你要安装的路径)
make
make install
安装完成即可。


--  作者:djsone
--  发布时间:4/8/2004 5:25:00 PM

--  
我测试如下例子,生成一个带中文的xml文档:
当屏蔽生成属性节点的代码时显示正常,包含时就会报错"output error : string is not in UTF-8",
#include <stdio.h>
#include <string.h>
#include <libxml/encoding.h>
#include <libxml/xmlwriter.h>

#if defined(LIBXML_WRITER_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)

#define MY_ENCODING "UTF-8"

xmlChar *ConvertInput(const char *in, const char *encoding);

int main(int argc, char *argv[])
{
 int rc;
    xmlTextWriterPtr writer;   
    char *tmp;

 writer = xmlNewTextWriterFilename("chinese.xml", 0);
    if (writer == NULL) {
        printf("testXmlwriterFilename: Error creating the xml writer\n");
        return;
    }

 rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL);
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterStartDocument\n");
        return;
    }

 /*********************中文测试**********************/

 rc = xmlTextWriterStartElement(writer, BAD_CAST "实例");
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
        return;
    }

 tmp = ConvertInput("非常好",MY_ENCODING);
 
 /*
 rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "制作人",
                               BAD_CAST tmp);
 if (rc < 0) {
  printf
   ("testXmlwriterFilename: Error at xmlTextWriterWriteAttribute\n");
     return;
 }
 */

 
 rc = xmlTextWriterWriteElement(writer, BAD_CAST "子实例", BAD_CAST tmp);
    if (rc < 0) {
        printf
            ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
        return;
    }
 if(tmp!=NULL) xmlFree(tmp);

 rc = xmlTextWriterEndElement(writer);
    if (rc < 0) {
        printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n");
        return;
    }

 /*********************中文测试完*********************/

 rc = xmlTextWriterEndDocument(writer);
    if (rc < 0) {
        printf("testXmlwriterMemory: Error at xmlTextWriterEndDocument\n");
        return;
    }
 
 xmlFreeTextWriter(writer);
    
 return 0;
}

//将输入字符串转换成指定的编码格式
xmlChar * ConvertInput(const char *in, const char *encoding)
{
    xmlChar *out;
    int ret;
    int size;
    int out_size;
    int temp;
    xmlCharEncodingHandlerPtr handler;

    if (in == 0)
        return 0;

    handler = xmlFindCharEncodingHandler(encoding);

    if (!handler) {
        printf("ConvertInput: no encoding handler found for '%s'\n",
               encoding ? encoding : "");
        return 0;
    }

    size = (int) strlen(in) + 1;
    out_size = size * 2 - 1;
    out = (unsigned char *) xmlMalloc((size_t) out_size);

    if (out != 0) {
        temp = size - 1;
        ret = handler->input(out, &out_size, (const xmlChar *) in, &temp);
        if (ret || temp - size + 1) {
            if (ret) {
                printf("ConvertInput: conversion wasn't successful.\n");
            } else {
                printf
                    ("ConvertInput: conversion wasn't successful. converted: %i octets.\n",
                     temp);
            }

            xmlFree(out);
            out = 0;
        } else {
            out = (unsigned char *) xmlRealloc(out, out_size + 1);
            out[out_size] = 0;  /*null terminating out */
        }
    } else {
        printf("ConvertInput: no mem\n");
    }

    return out;
}

#else
int main(void) {
    fprintf(stderr, "Writer or output support not compiled in\n");
    exit(1);
}
#endif


--  作者:djsone
--  发布时间:4/8/2004 5:37:00 PM

--  
还有,如果我把上面的编码UTF-8改成gb2312后编译,错误提示说“iconv_open cannot open conversion file /usr/lib/nls/conv/gb2312_UTF-8;iconv_open cannot open conversion file /usr/lib/nls/conv/UTF-8_gb2312”
我是不是需要装个编码转换器什么的??
这个问题困惑了我好几天,恳请帮忙,多谢先!
--  作者:djsone
--  发布时间:4/9/2004 3:45:00 PM

--  
自己顶一把!

哪位大侠会的请快快援手!!


--  作者:^cylinder^
--  发布时间:10/20/2004 4:29:00 PM

--  
我今天试了试中午,可以的啊。
--  作者:^cylinder^
--  发布时间:11/5/2004 4:46:00 PM

--  
最近试验结果:
可以生产中文的XML文件,但是在对一个带中文的XML文件进行解析的时候,libxml2系统不能正确解析。报错。
不知道应该如何处理?
请高手指教。
--  作者:不知道为什么
--  发布时间:5/15/2005 10:43:00 AM

--  
用xmlFindCharEncodingHandler没成功过,但用iconv就可以
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
125.000ms