标签: libxml2

libxml2 和 XPath 在 ANSI C 中遍历子级和兄弟级

我已经在 Perl 中完成了相当多的 XML 工作,现在我需要在 ANDI C 中为一个项目完成这些工作。这是我用 XML 片段编写的代码。我在某种程度上取得了成功,但在获得兄弟姐妹方面遇到了问题,我确信这非常容易,但我就是无法得到它。有两个函数,第一个函数只是获取节点集(直接从 xmlsoft.org 复制)。第二个功能是我的。

xmlXPathObjectPtr getnodeset (xmlDocPtr doc, xmlChar *xpath){

    xmlXPathContextPtr context;
    xmlXPathObjectPtr result;

    context = xmlXPathNewContext(doc);
    if (context == NULL) {
        printf("Error in xmlXPathNewContext\n");
        return NULL;
    }

    result = xmlXPathEvalExpression(xpath, context);
    xmlXPathFreeContext(context);

    if (result == NULL) {
        printf("Error in xmlXPathEvalExpression\n");
        return NULL;
    }

    if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
        xmlXPathFreeObject(result);
                printf("No result\n");
        return NULL;
    }

    return result;
}

    void reader(xmlDocPtr xmlDoc, char *xpath)
{

    xmlXPathObjectPtr xpathresult;
    xmlNodeSetPtr node;
    xmlNodeSetPtr node2;
    xmlChar *title;

    int cnt;

    // parse …
Run Code Online (Sandbox Code Playgroud)

c xpath libxml2

3
推荐指数
1
解决办法
5651
查看次数

如何使用 CMakeLists.txt 和 AndroidStudio 将 libxml2 本机库集成到 Android-NDK 项目中?

请帮助我在Android NDK中使用配置使用libxml2native-lib - XML解析库。CMakeLists.txt

我在这里找到了一个来源。但不知道如何将其集成到AndroidStudioCMakeLists.txt中。需要在我的 android-NDK 项目中包含此存储库中的哪些内容才能使用 libxml2?

android libxml2 android-ndk android-studio

3
推荐指数
1
解决办法
1929
查看次数

Python的libxml2无法解析unicode字符串

好的,Python的libxml2绑定的文档确实如此****.我的问题:

XML文档存储在Python中的字符串变量中.该字符串是Unicode的实例,其中包含非ASCII字符.我想用libxml2解析它,看起来像这样:

# -*- coding: utf-8 -*-
import libxml2

DOC = u"""<?xml version="1.0" encoding="UTF-8"?>
<data>
  <something>Bäääh!</something>
</data>
"""

xml_doc = libxml2.parseDoc(DOC)
Run Code Online (Sandbox Code Playgroud)

结果如下:

Traceback (most recent call last):
  File "test.py", line 13, in <module>
    xml_doc = libxml2.parseDoc(DOC)
  File "c:\Python26\lib\site-packages\libxml2.py", line 1237, in parseDoc
    ret = libxml2mod.xmlParseDoc(cur)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 46-48:
ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

关键是u"..."宣言.如果我用简单的替换它"..",那么一切都很好.不幸的是它在我的设置中不起作用,因为它DOC肯定是一个Unicode实例.

有谁知道如何使用libxml2来解析UTF-8编码的字符串?

python xml unicode libxml2

2
推荐指数
2
解决办法
4833
查看次数

使用libxml SAX解析HTML片段

我需要解析HTML片段,我的意思是文件缺少<html>,<head>和<body>元素,否则具有格式良好的XHTML语法,保证UTF8编码.看起来libxml对于这个任务来说是理想的,但我有一些我不知道如何实现的约束.

  1. htmlSAXParseFile()可以很好地完成它的工作,但它似乎创建了DOM本身,在进程中插入了bodyhtml元素.我想自己创建DOM,因为我可能需要跳过一些元素并动态修改其他元素.有可能以某种方式告诉libxml 根本不创建DOM而只是解析HTML并调用我的处理程序吗?
  2. 如果这对于libxml HTML解析器是不可能的,我不妨使用似乎不创建DOM的xmlSAXUserParseFile().但是,由于文件的结构类似于<p> ... </ p> <p> ... </ p>,因此解析器过早地吐出"文档末尾的额外内容".有没有办法抑制一些解析错误,同时仍然得到通知他们(只是因为没有人保证这些文件中永远不会有其他错误)?
  3. 有分析中的libxml功能,其中一些接受xmlParserOption作为参数的整个赫克.唉,xmlSAXUserParseFile()没有.那些完成所有这些似乎都是为了一些不相关的API设计原因而创建DOM.我错过了一个明显的候选人吗?

哦,我承认我不愿意使用libxml的DOM看起来像怪癖.我对RAM非常有限,因此我迫切需要对DOM进行全面控制才能在低内存条件下丢弃某些节点并在必要时重新读取它们.

提前致谢.

html c sax libxml2

2
推荐指数
1
解决办法
1634
查看次数

如何获取libxml2的内容?

我正在使用libxml2和C++.以下功能在此处崩溃return (char*)cur->content;.当我将其更改return (char*)cur->name;为时,它将返回attribute哪个是标签的名称.我想要的是1,2和3(基于C++代码下面的XML文件).我究竟做错了什么?

char* xml2sdf::getId(xmlNode* part){

    xmlNode* cur = part->xmlChildrenNode;

    // get the id
    while (cur != NULL) {

        if ( !xmlStrcmp(cur->name, (const xmlChar *)"attribute") ) {
            xmlAttrPtr attr = cur->properties;

            if( !xmlStrcmp( attr->children->content, (const xmlChar*)"id" ) ){
                return (char*)cur->content;
            }
        }

        cur = cur->next;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

它正在解析的XML文件的一部分:

<part ref="part10" name="part10">
    <attribute name="face">7</attribute>
    <attribute name="id">1</attribute>
</part>

<part ref="part20" name="part20">
    <attribute name="face">5</attribute>
    <attribute name="id">2</attribute>
</part>

<part ref="part30" name="part30">
    <attribute name="face">9</attribute>
    <attribute name="id">3</attribute>
</part>
Run Code Online (Sandbox Code Playgroud)

c++ libxml2

2
推荐指数
1
解决办法
7686
查看次数

如何使用XML :: LibXML获取节点的行号

我正在尝试使用XML :: LibXML处理XML 并报告某些元素所在的行.根据上面链接的文档,line_numbers选项应该做的伎俩,但我一直得到0.代码:

use XML::LibXML;

my $parser = XML::LibXML->new({ line_numbers => 1 });
my $xml = $parser->load_xml(location => 'some.xml');

for my $node ($xml->findnodes('//function')) {
    warn $node->nodePath,"\n";
    warn $node->line_number,"\n";
}
Run Code Online (Sandbox Code Playgroud)

找到节点,我的输出是

/database/functions/function
0
Run Code Online (Sandbox Code Playgroud)

知道如何让它工作吗?

xml perl libxml2

2
推荐指数
1
解决办法
1501
查看次数

如何检测XML元素是否具有子元素

我正在使用CPAN XML::LibXML模块处理下面的XML数据.我需要确定每个元素是否都有子元素.搜索我无法找到任何这样的例子.

<A>
    <ts>2012</ts>
    <T>M1</T>
    <T>M2</T>
    <B>
        <id>PC</id>
        <r>10</r>
        <r>30</r>
    </B>
</A>
Run Code Online (Sandbox Code Playgroud)

这是我写的Perl代码

#!/usr/bin/perl

use strict;
use warnings;

use XML::LibXML;

my ($x,$elname,$haschild)= ();
my $parser = XML::LibXML->new();
my $npo    = $parser->parse_file("test.xml");
my $rootel = $npo -> getDocumentElement();
$elname = $rootel -> nodeName();
print "Root name=$elname\n";

foreach $x ($rootel->childNodes) {
    $elname = $x -> nodeName();
    $haschild = $x->hasChildNodes;
    print "Child name = $elname and has child = $haschild.\n" unless ($elname =~ /#text/i);
}
Run Code Online (Sandbox Code Playgroud)

虽然我过去childNodes经历过每个节点,但我找不到一种简单的方法来确定节点是否有孩子.

我希望在遍历所有节点之后得到结果:

A: Has children …
Run Code Online (Sandbox Code Playgroud)

perl libxml2

2
推荐指数
1
解决办法
3909
查看次数

Xpath如何通过属性c ++ libxml2删除子节点

如何删除具有特定属性的子项?我使用的是c ++/libxml2.到目前为止我的尝试(在示例中我想删除id为"2"的子节点):

Given XML:
<p>
   <parent> <--- current context
       <child id="1" />
       <child id="2" />
       <child id="3" />
   </parent>
</p>

xmlNodePtr p = (parent node)// Parent node, in my example "current context"
xmlChar* attribute = (xmlChar*)"id";
xmlChar* attribute_value = (xmlChar*)"2";
xmlChar* xml_str;

for(p=p->children; p!=NULL; p=p->next){
  xml_str = xmlGetProp(p, attribute);
  if(xml_str == attribute_value){
     // Remove this node
   }
}
xmlFree(xml_str);
Run Code Online (Sandbox Code Playgroud)

c++ xpath libxml2

2
推荐指数
1
解决办法
3903
查看次数

libxml2:xmlNewTextWriterFilename泄漏

以下代码正确编译,valgrind报告没有泄漏:

# include <libxml/encoding.h>
# include <libxml/xmlwriter.h>

int main(void) {
  xmlTextWriterPtr XMLWriter = xmlNewTextWriterFilename("example.xml", 0);
  xmlTextWriterStartDocument(XMLWriter, NULL, NULL, NULL);
  xmlTextWriterEndDocument(XMLWriter);
  xmlFreeTextWriter(XMLWriter);
  xmlCleanupParser();
  return 0;
}

-----------------------------------------

==26059== HEAP SUMMARY:
==26059==     in use at exit: 0 bytes in 0 blocks
==26059==   total heap usage: 16 allocs, 16 frees, 4,774 bytes allocated
==26059== 
==26059== All heap blocks were freed -- no leaks are possible
Run Code Online (Sandbox Code Playgroud)

然而,一旦在xmlNewTextWriterFilename调用中指定了编码,hilary就会发生:

# include <libxml/encoding.h>
# include <libxml/xmlwriter.h>

int main(void) {
  xmlTextWriterPtr XMLWriter = xmlNewTextWriterFilename("example.xml", 0);
  xmlTextWriterStartDocument(XMLWriter, NULL, "UTF-8", …
Run Code Online (Sandbox Code Playgroud)

c valgrind memory-leaks libxml2

2
推荐指数
1
解决办法
1316
查看次数

如何在自定义Rails引擎gem中加载正确版本的动态库和gems(libxml,Nokogiri)?

我正在构建一个使用Nokogiri gem的rails引擎,我在MacOS 10.7和10.8中遇到了我的开发设置问题:

为了让Nokogiri在我的设置中正常工作,我更新了libxml和libxslt库:

brew update
brew install libxslt
brew upgrade libxml2
gem uninstall nokogiri
gem install nokogiri -- --with-xml2-include=/usr/local/Cellar/libxml2/2.9.0/include/libxml2 --with-xml2-lib=/usr/local/Cellar/libxml2/2.9.0/lib --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.28
Run Code Online (Sandbox Code Playgroud)

如果我在"常规"rails应用程序中使用它,Nokogiri可以正常工作(将它包含在Gemfile中,运行bundle install).

当我尝试从我正在构建的Rails引擎中使用Nokogiri并使用我的应用程序作为宝石时出现问题.

在gemspec中:

s.add_dependency 'nokogiri' # XML parsing
Run Code Online (Sandbox Code Playgroud)

我还在Gem的Gemfile顶部尝试了以下内容:

gem 'nokogiri'
Run Code Online (Sandbox Code Playgroud)

当我启动一个使用我的Rails Engine gem的应用程序时,我收到以下警告:

WARNING: Nokogiri was built against LibXML version 2.9.0, but has dynamically loaded 2.7.8
Run Code Online (Sandbox Code Playgroud)

如何配置gem和/或bundler和/或Rails以使用正确版本的Nokogiri和libxml以及libxslt?

另外,这是输出 nokogiri -v

# Nokogiri (1.5.9)
    ---
    warnings: []
    nokogiri: 1.5.9
    ruby:
      version: 1.9.3
      platform: x86_64-darwin12.3.0
      description: ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.3.0]
      engine: ruby
    libxml:
      binding: extension
      compiled: …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails libxml2 nokogiri rails-engines

2
推荐指数
1
解决办法
1017
查看次数