我正在使用解析器从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函数的最佳网站,以便我可以尝试自己解决这个问题?如何让脚本告诉我它正在做什么,因为此刻的输出只是一无所获.非常感谢.
我正在使用libxml2解析HTML,使用XPath来查找元素.一旦我找到了我正在寻找的元素,我如何从该元素中获取HTML作为字符串(请记住,此元素将包含许多子元素).给出一份文件:
<html>
<header>
<title>Some document</title>
</header
<body>
<p id="faq">
Some kind of text <a href="http://www.nowhere.com/">here</a>.
</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
假设我body使用XPath 检索了元素,然后为此获取HTML,我想最终得到一个包含以下内容的字符串:
<body>
<p id="faq">
Some kind of text <a href="http://www.nowhere.com/">here</a>.
</p>
</body>
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
目前,我使用XML :: LibXML perl模块根据定义的XML模式验证XML文件.目前,如果我的XML文件无法针对定义的XML Schema成功验证,我将得到一个错误列表通知我,例如某些元素不是预期的,然后是预期的.在我的XML文件中,我将有许多相同名称的元素,但它们可能嵌套在XML文件的不同位置.
我的问题是,无论如何,我可以在尝试执行验证时输出可能出错的任何元素的XPath位置吗?
目前,我的XML文件非常庞大,并且在验证失败时很难"调试"它,因为错误中显示的元素的名称可能会在XML文件的不同位置多次出现.
我的代码如下所示,使用LibXML根据模式验证XML文件.
#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;
my $schema_file = 'MySchema.xml';
my $document = 'MyFile.xml';
my $schema = XML::LibXML::Schema->new(location => $schema_file);
my $parser = XML::LibXML->new;
my $doc = $parser->parse_file($document);
eval { $schema->validate($doc) };
die $@ if $@;
print "$document validated successfully\n";
Run Code Online (Sandbox Code Playgroud) 我有一个大约200MB的XML文件,我希望逐行提取所选信息.
我用perl编写了一个脚本,使用模块XML :: LibXML解析文件内容,然后循环内容并逐行提取信息.这是无效的,因为它将整个文件读入内存,但我喜欢LibXML,因为我可以使用我需要的信息的XPath位置.
我可以获得有关如何使我的代码更有效的建议.
通过搜索我已经知道XML :: SAX和XML :: LibXML :: SAX,但我找不到解释用法的文档,它们似乎不包括任何类型的XPath寻址结构.
尝试读取和序列化具有UTF-16编码和声明的XML文档会导致Nokogiri在某个点之后产生垃圾.
C:\>nokogiri -v
# Nokogiri (1.5.5)
---
warnings: []
nokogiri: 1.5.5
ruby:
version: 1.9.3
platform: i386-mingw32
description: ruby 1.9.3p194 (2012-04-20) [i386-mingw32]
engine: ruby
libxml:
binding: extension
compiled: 2.7.7
loaded: 2.7.7
Run Code Online (Sandbox Code Playgroud)
我有一个用UTF-16(LE)编码的XML文件,它还在顶部包含一个PI XML声明,表明编码是UTF-16.总结一下,它看起来像这样:
<?xml version="1.0" encoding="UTF-16" ?>
<Foo>
<Bar><![CDATA[
Lorem ipsum dolor ...about 3900 more bytes of content here...
]]></Bar>
<Jim>Oh! Hello there.</Jim>
</Foo>
Run Code Online (Sandbox Code Playgroud)
当我使用Nokogiri阅读本文时,一切似乎都很好:
xml = File.open('Simplified.xml','rb:utf-16le',&:read)
p xml.encoding # #<Encoding:UTF-16LE>
p xml.valid_encoding? # true
doc1 = Nokogiri.XML(xml,&:noblanks)
xml1 = doc1.to_xml.encode('utf-8')
p xml1.encoding # #<Encoding:UTF-8> …Run Code Online (Sandbox Code Playgroud) Do XML::LibXML::Node::find和相关方法是否保证节点列表总是按照XML文档中的顺序排序?
这对我来说很重要,因为我的文档对应于一个大数组,在这个数组中我希望能够在某些情况下删除一系列项目,并且我必须确保这样的内容一致地工作:
my @nodes = $dom->find('//MyElement[@attr=something]/descendant::Token/@id')
->get_nodelist;
for my $token ( reverse map { $_->value } @nodes ) {
splice @my_big_array, $token, 1;
}
Run Code Online (Sandbox Code Playgroud)
困难在于没有记录XML::LibXML,我不知道这是否取决于libxml2实现,我不了解的文档,或者DOM标准或其他W3C标准,这些标准显然没有被阅读我的凡人.
我已经用homebrew安装了libxml2和libxslt,但它不想安装libxml2-dev或libxslt-dev:
Error: No available formula for libxml2-dev
我有点子,港口,以及我能找到的一切.我甚至安装了Xcode命令行工具,但没有运气.在Mac 10.10上安装libxml2-dev和libxslt-dev的方法是什么?
我正在尝试在我的计算机上安装Rails 4.2.0,但我在安装Nokogiri时遇到问题.我按照第一个答案中的步骤" 捆绑安装停在Nokogiri ",但是当我跑步时brew install nokogiri,我得到以下内容:
Activating libxslt 1.1.28 (from /Users/dseibert/.rvm/rubies/ruby-2.2.0/lib/ruby/gems/2.2.0/gems/nokogiri-1.6.6.2/ports/x86_64-apple-darwin14.0.0/libxslt/1.1.28)...
checking for main() in -llzma... yes
checking for xmlParseDoc() in libxml/parser.h... no
checking for xmlParseDoc() in -lxml2... no
checking for xmlParseDoc() in -llibxml2... no
-----
libxml2 is missing. Please locate mkmf.log to investigate how it is failing.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers. Check the mkmf.log file for more details. You may
need …Run Code Online (Sandbox Code Playgroud) 我正在为libxml2 C库开发一个Swift 3包装器.
转换String为两种便捷方法,UnsafePointer<xmlChar>反之亦然.在libxml2 xmlChar中声明为unsigned char.
UnsafePointer<xmlChar>到String是简单
func stringFrom(xmlchar: UnsafePointer<xmlChar>) -> String {
let string = xmlchar.withMemoryRebound(to: CChar.self, capacity: 1) {
return String(validatingUTF8: $0)
}
return string ?? ""
}
Run Code Online (Sandbox Code Playgroud)对于String到UnsafePointer<xmlChar>我试过,例如很多事情
let bytes = string.utf8CString.map{ xmlChar($0) }
return UnsafePointer<xmlChar>(bytes)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,我发现的唯一可行解决方案是
func xmlCharFrom(string: String) -> UnsafePointer<xmlChar> {
let pointer = (string as NSString).utf8String
return unsafeBitCast(pointer, to: UnsafePointer<xmlChar>.self)
}
Run Code Online (Sandbox Code Playgroud)有没有更好的,swiftier没有桥投地的方式NSString和unsafeBitCast?