我回答了一段时间的问题,我最初建议使用XML :: DOM.在mirod建议我使用XML :: LibXML后,我实现了它.说实话,它在我的系统上运行良好.我看到我的运行时使用新模块大幅下降而没有进行任何额外的优化.
现在是棘手的部分,由于某种原因,该模块甚至没有安装在我的同事系统上.
ppm install xml-libxml返回:下载ActiveState包存储库packlist ...未修改ppm安装失败:找不到提供xml-libxml的任何包
我在这两台机器之间找到的唯一区别是我使用的是AS Perl v5.12.1,而他是在AS perl V5.8.8上.
AS Perl v5.8.8是否支持xml-libxml?
此外,我访问了活动状态PPM索引,这似乎表明它一直打破5.8到5.12.
有没有人有这个模块的经验?我应该回滚到XML :: DOM - 它的性能很慢而且没有主动维护,至少安装和工作?
任何指针都会非常感激.
我有一个XML文件,我想读它 - 删除一个节点 - 保存它.我从终端运行perl(perl script.pl)
示例XML(filename.xml):
<?xml version="1.0" encoding="UTF-8"?>
<twice>
<inner>
<twice>
<name>John</name>
<surname>Smith</surname>
</twice>
<twice>
<name>Alan</name>
<surname>Bowler</surname>
</twice>
<twice>
<name>Michael</name>
<surname>Deck</surname>
</twice>
</inner>
</twice>
Run Code Online (Sandbox Code Playgroud)
示例perl脚本(script.pl):
use strict;
use warnings;
use XML::LibXML;
my $filename = "filename.xml";
my $parser = XML::LibXML->new();
my $xmldoc = $parser->parse_file($filename);
for my $dead ($xmldoc->findnodes(q{/twice/inner/twice[surname = "Bowler"]})) {
$dead->unbindNode;
}
print $xmldoc->toString;
Run Code Online (Sandbox Code Playgroud)
现在它在终端输出预期结果,但不保存文件.
预期结果(filename.xml):
<?xml version="1.0" encoding="UTF-8"?>
<twice>
<inner>
<twice>
<name>John</name>
<surname>Smith</surname>
</twice>
<twice>
<name>Michael</name>
<surname>Deck</surname>
</twice>
</inner>
</twice>
Run Code Online (Sandbox Code Playgroud)
我搜索了好几个小时,找不到任何东西,对不起,如果它是重复的!
这是我第一次体验perl,所以请欢迎任何帮助,谢谢.
我在我的Windows XP操作系统上安装了Strawberry Perl.后来我试图执行.XML文件,但它抛出错误如下.我也试过Active Perl并且也得到了同样的错误.
我在命令提示符下运行以下代码:
C:> perl xcp_conf.pl FILENAME.xml
Run Code Online (Sandbox Code Playgroud)
错误:无法在@INC中找到XML/LibXML.pm包含:C:/ Perl/site/Lib C:/ perl/Lib at xcp_conf.pl
你能告诉我在哪里下载上述文件吗?如何安装该包?
总菜鸟在这里,所以我很抱歉我提前无知.
我搜索和搞砸的大部分内容都集中在使用XML::LibXMLXPath.
我遇到的问题是我不想在标签之间捕获文本:我需要标签的值.
这是我的XML结构
<users>
<entry name="asd">
<permissions>
<role-based>
<superuser>yes</superuser>
</role-based>
</permissions>
</entry>
<entry name="fgh">
<permissions>
<role-based>
<superuser>yes</superuser>
</role-based>
</permissions>
<authentication-profile>RSA Two-Factor</authentication-profile>
</entry>
<entry name="jkl">
<permissions>
<role-based>
<superreader>yes</superreader>
</role-based>
</permissions>
<authentication-profile>RSA Two-Factor</authentication-profile>
</entry>
</users>
Run Code Online (Sandbox Code Playgroud)
我试图获取name属性(不带引号),并确定此人是超级用户还是超级读者.
除了打印节点之外,我无法做很多事情.我需要将其转换为用户名结构中的CSV文件; 角色
我有很多XML文件,我必须阅读它们,然后看看它们是否有效.我有一些文件与缺少endtag有问题.现在我的任务是编写一个读取这些文件的代码,只在有无效文件时打印错误消息和文件名,然后转到下一个文件.
我是Perl和XML的新手.但是,如果我知道如何处理有错误,那么我可以休息.我所知道的是,我在代码中有这样一行并读取XML文件,然后查找解析.如果不正常则会在命令行中产生错误.我的目标是有条件然后我会写一条消息.
use strict;
use warnings;
use XML::LibXML;
use XML::Simple;
use XML::LibXML::XPathContext qw( );
use XML::Writer;
# reads all file
my @testFile = <*.xml>;
my $arrSize = @testFile;
XML::LibXML::XPathContext->new()
my $doc = XML::LibXML->load_xml(location => $ver);
my $name_ver = $xml->findnodes('/Info/Name',$doc);
## do some other things
Run Code Online (Sandbox Code Playgroud)
我希望这在某种程度上清楚我的意思.任何人都可以让我知道我怎么能写一个不允许代码停止的条件,而是去其他行并打印一条消息.
在以下 HTML 片段中:
<div><p class="a b c"></p> <p class="a c"></p> <p class="d"></p> </div>
我只想使用选择器选择第二个p元素(带a类和不带b类)not,如下所示:
p.a:not(.b)
xpath对应的是
.//p[contains(concat(' ', normalize-space(@class), ' '), ' a ')][not(self::*[contains(concat(' ', normalize-space(@class), ' '), ' b ')])].
但是当我使用该 xpath 表达式时,它无法定位该元素。
还有什么可以用来实现not选择器的效果吗?
更新:似乎我犯了一个错误,因为p.a:not(.b)它的 xpath 对应物似乎对XML::LibXML.
它没有用,因为我if弄错了一个条件......
有这样的XML文件 - t.xml
<?xml version="1.0"?>
<ArrayOfFiles xmlns="Our.Files" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<File>
<DownloadCount>1</DownloadCount>
<Id>11</Id>
</File>
<File>
<DownloadCount>2</DownloadCount>
<Id>22</Id>
</File>
</ArrayOfFiles>
Run Code Online (Sandbox Code Playgroud)
该xmlns声明是无效的,在xmlstarlet抱怨它,例如使用:
xmlstarlet sel -t -v "//File/Id" t.xml
Run Code Online (Sandbox Code Playgroud)
版画
t.xml:2.32: xmlns: URI Our.Files is not absolute
<ArrayOfFiles xmlns="Our.Files" xmlns:i="http://www.w3.org/2001/XMLSchema-instan
Run Code Online (Sandbox Code Playgroud)
可能出于同样的原因,我也无法使用以下perl代码:
use 5.014;
use warnings;
use XML::LibXML;
my $dom = XML::LibXML->new->parse_file('t.xml');
my $res = $dom->findnodes('//File/Id');
say $_->textContent for $res->get_nodelist;
Run Code Online (Sandbox Code Playgroud)
当我省略xmlns声明时,例如尝试解析这个修改过的XML文件
<?xml version="1.0"?>
<ArrayOfFiles>
<File>
<DownloadCount>1</DownloadCount>
<Id>11</Id>
</File>
<File>
<DownloadCount>2</DownloadCount>
<Id>22</Id>
</File>
</ArrayOfFiles>
Run Code Online (Sandbox Code Playgroud)
上面的代码DWIM - 并打印:
11
22
Run Code Online (Sandbox Code Playgroud)
问题是,如何解析原始XML文件,因为它是从外部站点下载的 …
我正在使用 XML::LibXML::Reader 来解析一个大文档,但遇到了一个问题,即属性 xmlns 导致 findnodes() 失败。我通过添加正则表达式来删除 xmls 属性来修复它,但我想知道是否有更优雅的解决方案不涉及正则表达式。如果您删除正则表达式行 ($xml =~ s{xmlns...),您将看到“Loc = $loc”不会产生任何结果。
这是代码:
use strict;
use warnings;
use feature qw( say );
use XML::LibXML::Reader qw( XML_READER_TYPE_ELEMENT );
my $xml = <<'__EOI__';
<url xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<loc>http://example.com</loc>
<lastmod>2018-10-19</lastmod>
</url>
__EOI__
$xml =~ s{xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"}{};
my $reader = XML::LibXML::Reader->new( string => $xml);
while ( $reader->read ) {
next unless $reader->nodeType == XML_READER_TYPE_ELEMENT;
next unless $reader->name eq 'url';
my $xml = $reader->readOuterXml;
my $doc = XML::LibXML->load_xml(string => $xml);
say "Doc = $doc";
my ($loc) …Run Code Online (Sandbox Code Playgroud) 我想替换我的 XML 文件的元素节点,但我什至没有成功获取节点。我下面的代码适用于其他子节点,但不适用于id节点。
这是我的 XML 文件:
<header>
<idset id="100">
<a>item_a</a>
<b>item_b</b>
</idset>
</header>
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use XML::LibXML;
my $file = 'test.xml';
my $parser = XML::LibXML->new();
my $doc = $parser->load_xml(location => $file);
my($object11) = $doc->findnodes('/header/idset');
say 'a: ',$object11->findvalue('./a');
say 'b: ',$object11->findvalue('./b');
say 'id: ',$object11->findvalue('./id');
Run Code Online (Sandbox Code Playgroud)
当前结果:
a: item_a
b: item_b
id:
Run Code Online (Sandbox Code Playgroud)
期待结果:
a: item_a
b: item_b
id: 100
Run Code Online (Sandbox Code Playgroud) 作为我上一个问题的后续问题(Perl XML::LibXML 从特定节点获取信息)
给定以下 XML 数据,我无法弄清楚如何获取标记后显示的数据<tab/>(该标记没有结束标记,而不从该部分内的子节点获取所有数据?有关更多详细信息,请参阅下文:
XML 示例:
<title number="3">
<catchline>Uniform Agricultural Cooperative Association Act</catchline>
<chapter number="3-1">
<catchline>
General Provisions Relating to Agricultural Cooperative Associations
</catchline>
<section number="3-1-1">
<histories>
<history>
Amended by Chapter
<modchap sess="2010GS">378</modchap>
, 2010 General Session
</history>
<modyear>2010</modyear>
</histories>
<catchline>Declaration of policy.</catchline>
<tab/>
It is the declared policy of this state, as one means of improving the economic position of agriculture, to encourage the organization of producers of agricultural products into effective associations …Run Code Online (Sandbox Code Playgroud) perl ×10
xml-libxml ×10
xml ×7
libxml2 ×2
activeperl ×1
css ×1
selector ×1
xml-parsing ×1
xpath ×1