我在使用sax解析器时遇到了(我认为是)一种奇怪的行为,我想知道它是否正常.
我通过SAX解析器发送这个XML:
<site url="http://example.com/?a=b&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&b=c\" />";
xmlSAXUserParseMemory( handler,
NULL,
xml,
strlen(xml)
);
}
Run Code Online (Sandbox Code Playgroud)
PS:这条消息实际上是从LibXML2列表中提取的......我不是这封邮件的最初作者,但我注意到使用Nokogiri和Aaron(Nokogiri的维护者)的问题实际上是自己发布了这条消息.
我正在使用解析器从XML文件中获取数据.我使用libxml2来提取数据.我无法从节点获取属性.我只发现nb_attributes得到了属性的计数.
我有一个简单的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函数的最佳网站,以便我可以尝试自己解决这个问题?如何让脚本告诉我它正在做什么,因为此刻的输出只是一无所获.非常感谢.
我正试图在Go中从头开始创建一个XMPP库(以及后来的服务器)(尽管语言本身是无关紧要的),作为一种学习XMPP协议和服务器软件开发的方法.
正如你们许多人所知,XMPP是基于XML的消息传递协议,它依赖于大量短而频繁的XML流.我认为对于这样的应用程序,基于事件的XML解析器应该更好,因为我不需要DOM和所有这些(如果我错了,请纠正我).请记住,此库适用于服务器,因此可能会同时运行多个实例;
对于该用例libxml2或expat,两者中哪一个具有更好的性能和内存使用?
我正在尝试使用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) 我正在使用libxml2的xmlwriter api编写一个xml文件.
当我用记事本打开文件时,缩进不正确.
有谁知道如何解决它?
非常感谢.
我有一个大约200MB的XML文件,我希望逐行提取所选信息.
我用perl编写了一个脚本,使用模块XML :: LibXML解析文件内容,然后循环内容并逐行提取信息.这是无效的,因为它将整个文件读入内存,但我喜欢LibXML,因为我可以使用我需要的信息的XPath位置.
我可以获得有关如何使我的代码更有效的建议.
通过搜索我已经知道XML :: SAX和XML :: LibXML :: SAX,但我找不到解释用法的文档,它们似乎不包括任何类型的XPath寻址结构.
我遇到以下行为:
$xml_string1 = "<person><name><![CDATA[ Someone's Name ]]></name></person>";
$xml_string2 = "<person><name> Someone's Name </name></person>";
$person = new SimpleXMLElement($xml_string1);
print (string) $person->name; # Someone'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's Name
Run Code Online (Sandbox Code Playgroud)
php文档说NOCDATA"将[CD] CDATA合并为文本节点".对我来说,这意味着CDATA将被视为与文本节点相同 - 或者第三个示例的行为现在将与第二个示例相同.
我无法控制XML(它是来自外部源的提要),否则我只是删除CDATA标记,因为它什么也不做,并且破坏了我想要的行为.
为什么上面的例子表现得如此?有没有办法让SimpleXML以与处理文本节点相同的方式处理CDATA节点?"合并CDATA作为文本节点"实际上做了什么,因为我似乎不理解该选项?
在我提取数据之后,我正在解码,但上面的例子对我来说仍然没有意义.
我一直试图将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) 更新2:
事实证明,主要问题与我的想法不同,并在此寻求帮助.我将新问题移到了一个新帖子:
更新: 好的,所以我意外地搞砸了我的非虚拟玩家.非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)