当我在 XPath 中使用 libxml 时遇到问题。我想解析一个 youtube 播放列表:
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom'
xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/'
xmlns:media='http://search.yahoo.com/mrss/'
xmlns:batch='http://schemas.google.com/gdata/batch'
xmlns:yt='http://gdata.youtube.com/schemas/2007'
xmlns:gd='http://schemas.google.com/g/2005'
gd:etag='W/"Dk8DRn47eCp7ImA9WxRQGEk."'>
<id>tag:youtube,2008:user:andyland74:playlists</id>
<updated>2008-07-21T16:43:25.232Z</updated>
<category scheme='http://schemas.google.com/g/2005#kind'
term='http://gdata.youtube.com/schemas/2007#playlistLink'/>
<title>Playlists of andyland74</title>
<logo>http://www.youtube.com/img/pic_youtubelogo_123x63.gif</logo>
<link rel='related' type='application/atom+xml'
href='http://gdata.youtube.com/feeds/api/users/andyland74?v=2'/>
<link rel='alternate' type='text/html'
href='http://www.youtube.com/profile_play_list?user=andyland74'/>
<link rel='http://schemas.google.com/g/2005#feed'
type='application/atom+xml'
href='http://gdata.youtube.com/feeds/api/users/andyland74/playlists?v=2'/>
<link rel='http://schemas.google.com/g/2005#post'
type='application/atom+xml'
href='http://gdata.youtube.com/feeds/api/users/andyland74/playlists?v=2'/>
<link rel='http://schemas.google.com/g/2005#batch'
type='application/atom+xml'
href='http://gdata.youtube.com/feeds/api/users/andyland74/playlists/batch?v=2'/>
<link rel='self' type='application/atom+xml'
href='http://gdata.youtube.com/feeds/api/users/andyland74/playlists?...'/>
<link rel='service' type='application/atomsvc+xml'
href='http://gdata.youtube.com/feeds/api/users/andyland74/playlists?alt=...'/>
<author>
<name>andyland74</name>
<uri>http://gdata.youtube.com/feeds/api/users/andyland74</uri>
</author>
<generator version='2.0'
uri='http://gdata.youtube.com/'>YouTube data API</generator>
<openSearch:totalResults>3</openSearch:totalResults>
<openSearch:startIndex>1</openSearch:startIndex>
<openSearch:itemsPerPage>25</openSearch:itemsPerPage>
<entry gd:etag='W/"Dk8DRn47eCp7ImA9WxRQGEk."'>
<id>tag:youtube,2008:user:andyland74:playlist:8BCDD04DE8F771B2</id>
<published>2007-11-04T17:30:27.000-08:00</published>
<updated>2008-07-15T12:33:20.000-07:00</updated>
<app:edited xmlns:app='http://www.w3.org/2007/app'>2008-07-15T12:33:20.000-07:00</app:edited>
<category scheme='http://schemas.google.com/g/2005#kind'
term='http://gdata.youtube.com/schemas/2007#playlistLink'/>
<title>My New Playlist …Run Code Online (Sandbox Code Playgroud) 我很难找到一种方法来提取节点的所有属性的列表,而不知道它们被称为什么.
我使用以下方法提取单个已知属性:
xmlGetProp(cur, (const xmlChar*)"nodename")
但是如何使用libxml2获取所有属性的列表?
问候,marius
我的问题是我想创建xml树并获得一个简单的字符串对象(甚至是char*).我无法将xml保存到文件中.
所以在输入中我有xmlDocPtr和完整的xml树,并希望得到包含xml但不使用文件的字符串.
请注意.
我目前正在尝试安装一个失败的ruby gem,因为extconf说它需要libxml,所以当我按照这些说明安装libxml(包括ruby开发工具包安装的这些说明)时,我得到以下输出:
$ gem install libxml-ruby --platform x86-mswin32-60
Temporarily enhancing PATH to include DevKit...
Building native extensions. This could take a while...
ERROR: Error installing libxml-ruby:
ERROR: Failed to build gem native extension.
c:/Ruby/bin/ruby.exe extconf.rb
checking for socket() in -lsocket... no
checking for gethostbyname() in -lnsl... no
checking for atan() in -lm... yes
checking for inflate() in -lz... no
checking for inflate() in -lzlib... no
checking for inflate() in -lzlib1... yes
checking for iconv_open() in -liconv... …Run Code Online (Sandbox Code Playgroud) /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/mkmf.rb:381:in `try_do':
The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
Run Code Online (Sandbox Code Playgroud)
我在CentOS 6.2服务器上使用RVM安装了ruby 1.9.3.当我尝试运行gem install nokogiri它时产生下面的输出.我已经访问了nokogiri网站并使用yum安装了libxml2和libxslt依赖项:
sudo yum install -y gcc ruby-devel libxml2 libxml2-devel libxslt libxslt-devel
Run Code Online (Sandbox Code Playgroud)
我还安装了libxml2和libxslt软件包,rvm pkg install然后重新安装了ruby.
我一直在寻找解决方案,但我还没有找到任何东西.任何想法,将不胜感激 :)
Building native extensions. This could take a while...
ERROR: Error installing nokogiri:
ERROR: Failed to build gem native extension.
/usr/local/rvm/rubies/ruby-1.9.3-p194/bin/ruby extconf.rb
checking for libxml/parser.h... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack …Run Code Online (Sandbox Code Playgroud) 我使用libxml2来解析xml但是在编译它抛出的解决方案时
fatal error : cannot open iconv.h
当我把它放在iconv.h那里然后再次重建然后再次抛出其他
error unable to open include file sys/cdefs.h.
我最终陷入了恶性循环.请帮忙
请帮助getpath()在getpath()xpath 中返回完整的标签名称或找到解决方法
我正在尝试为lxml.etree._ElementTree. ElementTree通过解析来自某些生产 WebService 的 600Kb 响应生成。
print elem.getroottree().getpath(elem)
Run Code Online (Sandbox Code Playgroud)
这是我得到的结果:
'/S:Envelope/S:Body/ns5:getPhysicalResponse/*[18]/*[12]/*[6]/*[2]'
Run Code Online (Sandbox Code Playgroud)
不幸的是,我无法发布原始 xml - 它包含专有的客户信息。此外,我尝试使用自动生成的具有 100 个嵌套级别的简单元素树来重现此结果,每个级别有 100 个子级,但没有运气 -getpath()返回带有完整标签名称的 xpath。
更新
查看lxml 源代码- 它指向库中的tree.h xmlGetNodePath方法libxml2。所以这实际上是libxml2行为。
更新 做更多的测试,我发现每次标签具有非默认命名空间时都会发生这种情况。
对于我的生活,我无法找到正确的代码来访问我的XML文件中的注释行.难道我用findnodes,find,getElementByTagName(怀疑).
我是否正确地假设这些评论行是可访问的?我希望如此,因为我知道我可以添加评论.
注释节点的类型编号为8,因此它们必须是可解析的.
最终,我想要做的就是删除它们.
my @nodes = $dom->findnodes("//*");
foreach my $node (@nodes) {
print $node->nodeType, "\n";
}
<TT>
<A>xyz</A>
<!-- my comment -->
</TT>
Run Code Online (Sandbox Code Playgroud) 该描述的xmlNodeDump()(其需要一个xmlBufferPtr)状态:
由于这是使用 xmlBuffer 结构,它被限制为 2GB 并且以某种方式被弃用,请改用 xmlBufNodeDump()。
很公平,但是因为xmlBufNodeDump()(和 eg xmlBufGetNodeContent)xmlBufPtr提出了我的问题:如何创建这样的xmlBuf缓冲区?
我找不到任何明显的东西。
以及如何释放它?
我的意思是,因为xmlBuffer有例如xmlBufferCreate()。
或者应该获得一个xmlOutputBuffer通孔xmlAllocOutputBuffer()并将其xmlOutputBuffer::buffer 属性(类型xmlBuf*)用于xmlBufNodeDump()?
我以以下 XML 为例:
<root xmlns="http://www.plmxml.org/Schemas/PLMXMLSchema" >
<parentNode status="Good">
<A>
<B>
<C id="123" >C Node Value Here</C>
</B>
</A>
</parentNode>
</root>
Run Code Online (Sandbox Code Playgroud)
我的 XML 文件中有多个 parentNode 节点(这里只显示了一个),所以我在 parentNode 中循环。一旦我有了一个,我想在 XML 中再获得 3 个级别的属性值。我的 XML 使用名称空间,并且我已在 Perl 脚本中将该名称空间注册为“plm”。我可以在我的路径中使用名称空间来获取 parentNode 属性值。但是,当我尝试向下导航到节点“C”和拾取属性“id”时,出现以下错误:
XPath 错误:未定义的命名空间前缀错误:xmlXPathCompiledEval:评估失败
我正在使用以下 Perl 脚本。
use XML::LibXML;
use XML::LibXML::XPathContext;
my $filename = "namespaceissue.xml";
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($filename);
my $xc = XML::LibXML::XPathContext->new( $doc->documentElement() );
$xc->registerNs('plm', 'http://www.plmxml.org/Schemas/PLMXMLSchema');
foreach my $node ($xc->findnodes('/plm:root/plm:parentNode')) {
my $status = $node->findvalue('./@status');
print "Status = $status\n";
my …Run Code Online (Sandbox Code Playgroud)