我已经在 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) 请帮助我在Android NDK中使用配置使用libxml2native-lib - XML解析库。CMakeLists.txt
我在这里找到了一个来源。但不知道如何将其集成到AndroidStudioCMakeLists.txt中。需要在我的 android-NDK 项目中包含此存储库中的哪些内容才能使用 libxml2?
好的,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编码的字符串?
我需要解析HTML片段,我的意思是文件缺少<html>,<head>和<body>元素,否则具有格式良好的XHTML语法,保证UTF8编码.看起来libxml对于这个任务来说是理想的,但我有一些我不知道如何实现的约束.
哦,我承认我不愿意使用libxml的DOM看起来像怪癖.我对RAM非常有限,因此我迫切需要对DOM进行全面控制才能在低内存条件下丢弃某些节点并在必要时重新读取它们.
提前致谢.
我正在使用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) 我正在尝试使用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)
知道如何让它工作吗?
我正在使用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) 如何删除具有特定属性的子项?我使用的是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) 以下代码正确编译,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) 我正在构建一个使用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)