标签: libxml2

LibXML2 Sax解析和&符号

我在使用sax解析器时遇到了(我认为是)一种奇怪的行为,我想知道它是否正常.

我通过SAX解析器发送这个XML:

<site url="http://example.com/?a=b&amp;b=c"; />
Run Code Online (Sandbox Code Playgroud)

startElement调用回调时,"&"将转换为"&" .它应该这样做吗?如果是这样,我想了解原因.

我贴了一个例子来证明这个问题:

#include <stdlib.h>
#include <libxml/parser.h>

static void start_element(void * ctx, const xmlChar *name, const xmlChar **atts)
{
  int i = 0;
  while(atts[i] != NULL) {
    printf("%s\n", atts[i]);
    i++;
  }
}

int main(int argc, char *argv[]) {
  xmlSAXHandlerPtr handler = calloc(1, sizeof(xmlSAXHandler));
  handler->startElement = start_element;

  char * xml = "<site url=\"http://example.com/?a=b&amp;b=c\" />";

  xmlSAXUserParseMemory( handler,
                          NULL,
                          xml,
                          strlen(xml)
  );
}
Run Code Online (Sandbox Code Playgroud)

PS:这条消息实际上是从LibXML2列表中提取的......我不是这封邮件的最初作者,但我注意到使用NokogiriAaron(Nokogiri的维护者)的问题实际上是自己发布了这条消息.

escaping libxml2

6
推荐指数
1
解决办法
4531
查看次数

如何从libxml2中的节点获取属性

我正在使用解析器从XML文件中获取数据.我使用libxml2来提取数据.我无法从节点获取属性.我只发现nb_attributes得到了属性的计数.

c libxml2

6
推荐指数
4
解决办法
2万
查看次数

我的Perl脚本中的findnodes语句出了什么问题?

我有一个简单的xml文件,如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<microplateDoc xmlns="http://moleculardevices.com/microplateML">
<camelids>
  <species name="Camelus bactrianus">
    <common-name>Bactrian Camel</common-name>
    <physical-characteristics>
      <mass>450 to 500 kg.</mass>
      <appearance>
  Blah blah blah
   </appearance>
    </physical-characteristics>   
  </species>
  </camelids>
 </microplateDoc>   
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用以下perl脚本读取物种名称:

use XML::LibXML;

my $parser = XML::LibXML->new();
my $doc = $parser->parse_file('/Users/johncumbers/Documents/7_Scripts/Perl/XML_to_MySQL/simplified_camelids.xml');
my $xc = XML::LibXML::XPathContext->new( $doc->documentElement()  );
$xc->registerNs('ns', 'http://moleculardevices.com/microplateML');

#loop through to find species nodes
my @n = $xc->findnodes('*/species');  #was */species
foreach $nod (@n) {
    print "A: ".$nod->getAttribute("name")."\n";
    my @c = $nod->findnodes('./common-name');
    }
Run Code Online (Sandbox Code Playgroud)

但我没有找到任何节点.你能帮忙告诉我为什么它不起作用吗?什么是查找perl函数的最佳网站,以便我可以尝试自己解决这个问题?如何让脚本告诉我它正在做什么,因为此刻的输出只是一无所获.非常感谢.

perl xpath libxml2

6
推荐指数
1
解决办法
3227
查看次数

libxml2 vs expat用于XMPP服务器

我正试图在Go中从头开始创建一个XMPP库(以及后来的服务器)(尽管语言本身是无关紧要的),作为一种学习XMPP协议和服务器软件开发的方法.

正如你们许多人所知,XMPP是基于XML的消息传递协议,它依赖于大量短而频繁的XML流.我认为对于这样的应用程序,基于事件的XML解析器应该更好,因为我不需要DOM和所有这些(如果我错了,请纠正我).请记住,此库适用于服务器,因此可能会同时运行多个实例;

对于该用例libxml2或expat,两者中哪一个具有更好的性能和内存使用?

c xmpp go libxml2 expat-parser

6
推荐指数
1
解决办法
7012
查看次数

为什么在使用命名空间时,XML :: LibXML没有为此xpath查询找到节点

我正在尝试使用XPath查询选择一个节点,我不明白为什么XML :: LibXML在有xmlns属性时找不到该节点.这是一个演示此问题的脚本:

#!/usr/bin/perl

use XML::LibXML; # 1.70 on libxml2 from libxml2-dev 2.6.16-7sarge1 (don't ask)
use XML::XPath;  # 1.13
use strict;
use warnings;

use v5.8.4; # don't ask

my ($xpath, $libxml, $use_namespace) = @ARGV;

my $xml = sprintf(<<'END_XML', ($use_namespace ? 'xmlns="http://www.w3.org/2000/xmlns/"' : q{}));
<?xml version="1.0" encoding="iso-8859-1"?>
<RootElement>
  <MyContainer %s>
    <MyField>
        <Name>ID</Name>
        <Value>12345</Value>
    </MyField>
    <MyField>
        <Name>Name</Name>
        <Value>Ben</Value>
    </MyField>
  </MyContainer>
</RootElement>
END_XML

my $xml_parser
    = $libxml ? XML::LibXML->load_xml(string => $xml, keep_blanks => 1)
    :           XML::XPath->new(xml => $xml);

my $nodecount = 0;
foreach …
Run Code Online (Sandbox Code Playgroud)

xml perl xpath libxml2

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

xml缩进

我正在使用libxml2的xmlwriter api编写一个xml文件.

当我用记事本打开文件时,缩进不正确.

有谁知道如何解决它?

非常感谢.

xml libxml2

6
推荐指数
1
解决办法
6859
查看次数

使用perl处理大型xml文件

我有一个大约200MB的XML文件,我希望逐行提取所选信息.

我用perl编写了一个脚本,使用模块XML :: LibXML解析文件内容,然后循环内容并逐行提取信息.这是无效的,因为它将整个文件读入内存,但我喜欢LibXML,因为我可以使用我需要的信息的XPath位置.

我可以获得有关如何使我的代码更有效的建议.

通过搜索我已经知道XML :: SAX和XML :: LibXML :: SAX,但我找不到解释用法的文档,它们似乎不包括任何类型的XPath寻址结构.

xml perl sax libxml2

6
推荐指数
1
解决办法
1576
查看次数

PHP,SimpleXML,解码CDATA中的实体

我遇到以下行为:

$xml_string1 = "<person><name><![CDATA[ Someone&#039;s Name ]]></name></person>";
$xml_string2 = "<person><name> Someone&#039;s Name </name></person>";

$person = new SimpleXMLElement($xml_string1);
print (string) $person->name; # Someone&#039;s Name

$person = new SimpleXMLElement($xml_string2);
print (string) $person->name; # Someone's Name

$person = new SimpleXMLElement($xml_string1, LIBXML_NOCDATA);
print (string) $person->name; # Someone&#039;s Name
Run Code Online (Sandbox Code Playgroud)

php文档说NOCDATA"将[CD] CDATA合并为文本节点".对我来说,这意味着CDATA将被视为与文本节点相同 - 或者第三个示例的行为现在将与第二个示例相同.

我无法控制XML(它是来自外部源的提要),否则我只是删除CDATA标记,因为它什么也不做,并且破坏了我想要的行为.

为什么上面的例子表现得如此?有没有办法让SimpleXML以与处理文本节点相同的方式处理CDATA节点?"合并CDATA作为文本节点"实际上做了什么,因为我似乎不理解该选项?

在我提取数据之后,我正在解码,但上面的例子对我来说仍然没有意义.

php xml simplexml cdata libxml2

6
推荐指数
1
解决办法
8621
查看次数

让nokogiri使用更新版本的libxml2

我一直试图将Nokogiri安装在我的电脑(Mountain Lion)上与rspec和capybara一起使用,但对于我的生活,我无法让它运行正常.

据我所知,问题在于nokogiri使用了错误版本的libxml2.到目前为止,我尝试使用Homebrew卸载并重新安装libxml2(确保它是最新版本),使用bundle卸载并重新安装nokogiri,并指定安装nokogiri gem时Homebrew安装的libxml2文件的确切路径.我最近的安装说明看起来像这样

sudo 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)

所有这些位置都正确对应于安装工具的位置.但是,在运行时bundle exec rspec spec/requests/static_pages.rb,我仍然得到这个输出:

/Users/alex/.rvm/gems/ruby-1.9.3-p286/gems/nokogiri-1.5.9/lib/nokogiri.rb:28:in `require': dlopen(/Users/alex/.rvm/gems/ruby-1.9.3-p286/gems/nokogiri-1.5.9/lib/nokogiri/nokogiri.bundle, 9): Library not loaded: /usr/local/lib/libxml2.2.dylib (LoadError)
Referenced from: /Users/alex/.rvm/gems/ruby-1.9.3-p286/gems/nokogiri-1.5.9/lib/nokogiri/nokogiri.bundle
Reason: Incompatible library version: nokogiri.bundle requires version 12.0.0 or later, but libxml2.2.dylib provides version 10.0.0 - /Users/alex/.rvm/gems/ruby-1.9.3-p286/gems/nokogiri-1.5.9/lib/nokogiri/nokogiri.bundle
    from /Users/alex/.rvm/gems/ruby-1.9.3-p286/gems/nokogiri-1.5.9/lib/nokogiri.rb:28:in `<top (required)>'
    from /Users/alex/.rvm/gems/ruby-1.9.3-p286@global/gems/bundler-1.3.4/lib/bundler/runtime.rb:72:in `require'
    from /Users/alex/.rvm/gems/ruby-1.9.3-p286@global/gems/bundler-1.3.4/lib/bundler/runtime.rb:72:in `block (2 levels) in require'
    from /Users/alex/.rvm/gems/ruby-1.9.3-p286@global/gems/bundler-1.3.4/lib/bundler/runtime.rb:70:in `each'
    from /Users/alex/.rvm/gems/ruby-1.9.3-p286@global/gems/bundler-1.3.4/lib/bundler/runtime.rb:70:in `block in require'
    from /Users/alex/.rvm/gems/ruby-1.9.3-p286@global/gems/bundler-1.3.4/lib/bundler/runtime.rb:59:in `each'
    from /Users/alex/.rvm/gems/ruby-1.9.3-p286@global/gems/bundler-1.3.4/lib/bundler/runtime.rb:59:in `require'
    from /Users/alex/.rvm/gems/ruby-1.9.3-p286@global/gems/bundler-1.3.4/lib/bundler.rb:132:in `require'
    from /Users/alex/Sites/harbingernews/config/application.rb:7:in …
Run Code Online (Sandbox Code Playgroud)

ruby rspec ruby-on-rails libxml2 nokogiri

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

Python错误消息"不兼容的库版本"libxml和etree.so

更新2:

事实证明,主要问题与我的想法不同,并在此寻求帮助.我将新问题移到了一个新帖子:

在virtualenv中安装自定义python包


更新: 好的,所以我意外地搞砸了我的非虚拟玩家.非virtualenv(普通bash)我可以通过删除手动安装(通过点)lxml和运行轻松修复

conda install lxml --force
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,这在virtualenv中不起作用.在那里,跑步

    conda install lxml --force
Run Code Online (Sandbox Code Playgroud)

工作没有错误消息,但当我运行python并简单地说

>>> import lxml
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named lxml
Run Code Online (Sandbox Code Playgroud)

有什么建议??


旧消息:

我正在尝试将virtualenv用于我的python flask应用程序.没有virtualenv,python代码运行完美.

我已经在virtualenv中安装了我需要的软件包,但是我安装了lxml之后

pip install lxml
Installing collected packages: lxml
Successfully installed lxml-3.6.0
Run Code Online (Sandbox Code Playgroud)

运行我的代码时收到以下错误消息:

  File "/Users/XXX/xxx/flask-aws/lib/python2.7/site-packages/docx-0.2.4-py2.7.egg/docx.py", line 17, in <module>
from lxml import etree

ImportError: dlopen(/Users/XXX/xxx/flask-aws/lib/python2.7/site-packages/lxml/etree.so, 2): Library not loaded: libxml2.2.dylib
  Referenced from: /Users/XXX/xxx/flask-aws/lib/python2.7/site-packages/lxml/etree.so

  Reason: Incompatible library version: etree.so requires version 12.0.0 or later, …
Run Code Online (Sandbox Code Playgroud)

python virtualenv libxml2

6
推荐指数
1
解决办法
3170
查看次数

标签 统计

libxml2 ×10

xml ×4

perl ×3

c ×2

xpath ×2

cdata ×1

escaping ×1

expat-parser ×1

go ×1

nokogiri ×1

php ×1

python ×1

rspec ×1

ruby ×1

ruby-on-rails ×1

sax ×1

simplexml ×1

virtualenv ×1

xmpp ×1