我试图用来XPath提取一些HTML标签和数据,为此我需要使用XML::LibXML模块.
我尝试从CPAN shell安装它,但它没有安装.
我按照CPAN网站上有关安装的说明,我们需要安装libxml2,iconv以及zlib在安装之前的包装器XML::LibXML,它没有用完.
此外,如果还有其他更简单的模块可以完成我的任务,请告诉我.
手头的任务:
我<dd>在html页面上搜索特定的标签,这个标签非常大(大约5000 - 10000)<dd>和<dt>标签.所以,我正在编写一个匹配<dd>标记内容的脚本,并获取相应(下一个)<dt>标记内的内容.
我希望我能更清楚一点.任何帮助是极大的赞赏.
如何使用XML :: LibXML模块的findnodes()函数在XPath表达式中使用Perl变量?这就是我得到的:
my $variable = 1;
foreach my $node1 ($doc->findnodes('par/par1/par2[@id = $variable]'))
{
}
Run Code Online (Sandbox Code Playgroud)
但它似乎没有用.谢谢.
我正在使用XML :: LibXML,我想添加一个注释,使得注释不在标记之内.甚至可以把它放在标签之外?我试过appendChild,insertBefore | 之后,没有区别......
<JJ>junk</JJ> <!--My comment Here!-->
# Code excerpt from within a foreach loop:
my $elem = $dom->createElement("JJ");
my $txt_node = $dom->createTextNode("junk");
my $cmt = $dom->createComment("My comment Here!");
$elem->appendChild($txt_node);
$b->appendChild($elem);
$b->appendChild($frag);
$elem->appendChild($cmt);
# but it puts the comment between the tags ...
<JJ>junk<!--My comment Here!--></JJ>
Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的XML模板(摘录):
<isSomething>_xxx_</isSomething>
<someValue>_xxx_</someValue>
Run Code Online (Sandbox Code Playgroud)
我的代码通过模板并分别使用XML :: LibXML的findnode和setData方法替换_xxx_占位符.
最后它看起来像这样:
<isSomething>true</isSomething>
<someValue>123.45</someValue>
Run Code Online (Sandbox Code Playgroud)
这可以完成这项任务,但是如果isSomething标签看起来像这样,接收系统会更加满意:
<isSomething/>
Run Code Online (Sandbox Code Playgroud)
如果它是假的,将被完全省略.有没有办法用XML :: LibXML做到这一点,还是应该在字符串输出上应用强大的正则表达式功能?
我基本上是模块的新手,我试图在我的脚本中使用它们.我无法找到正确使用它们的正确方法,我想了解你的建议.
让我快速解释一下我要做的事情:
我的脚本正在根据XML文件中的数据进行一些文件传输.
所以基本上,我有XML文件,内容如下:
<fftg>
<actions>
<!-- Rename file(s) -->
<rename>
<mandatory>0</mandatory>
<file name="foo" to="bar" />
</rename>
<!-- Transfer file(s) -->
<transfer>
<mandatory>0</mandatory>
<protocol>SFTP</protocol>
<server>fqdn</server>
<port>22</port>
<file name="bar" remotefolder="toto" />
</transfer>
<!-- Transfer file(s) -->
<transfer>
<mandatory>0</mandatory>
<protocol>SFTP</protocol>
<server>fqdn</server>
<port>22</port>
<file name="blabla" remotefolder="xxxx" />
<file name="blabla2" remotefolder="xxxx" />
</transfer>
</actions>
</fftg>
Run Code Online (Sandbox Code Playgroud)
简而言之,我有一个执行"动作"的脚本.每个动作都可以重复X次.
现在,而不是一个重要的脚本与一堆子程序等..我认为为我的应用程序创建模块应该更好,并将操作放在模块中.
例如 :
FFTG::Rename
FFTG::Transfer
FFTG::Transfer::SFTP
FFTG::Transfer::FTP
Run Code Online (Sandbox Code Playgroud)
等等(我创建了所有这些模块,它们可以独立工作)
并根据XML文件中指定的操作调用这些模块.如果需要,人们可以创建新的模块/操作(我希望模块化).
现在,我不知道如何正确地做到这一点.
所以我的问题是:请问最好的方法是什么?
目前,我的脚本正在阅读这些动作:
# Load XML file
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($FFTG_TSF . "/" . $tid …Run Code Online (Sandbox Code Playgroud) 就像在这个 HTML 片段中一样:
元素<div class="c1"><span class="c2"><b class="c3"/></span></div>
的预期层次结构b应该是:div.c1 span.c2 b.c3
在编程方面,我总是遇到一些逻辑问题.我认为这很合乎逻辑,但对我来说很难,因为我无法到达那里.我正在使用XML :: LibXML来解析XML文件.现在在下面的代码中
<CommentsCorrectionsList>
<CommentsCorrections RefType="Cites">
<RefSource>Brain Cogn. 2005 Jul;58(2):245</RefSource>
</CommentsCorrections>
<CommentsCorrections RefType="RepublishedIn">
<RefSource>Brain Cogn. 2005 Jul;58(2):246-8</RefSource>
<PMID Version="1">16044513</PMID>
</CommentsCorrections>
<CommentsCorrections RefType="PartialRetractionOf">
<RefSource>Curr Opin Organ Transplant. 2001 Mar;6(1):95-101</RefSource>
</CommentsCorrections>
</CommentsCorrectionsList>
Run Code Online (Sandbox Code Playgroud)
我想为除"引用"之外的所有其他RefType选择commentscorrections.我该怎么做.我想通过将所有想要的RefType放在另一个变量中然后使用它来获取其他数据来做到这一点.这是正确的方法,我尝试了一些虚拟变量,如下所示
my $sam = "A" || "B" || "C";
print "test= ";
my $test = <>;
if ($test == $sam) {
print $test;
print "success";} else {
print "NO";}
Run Code Online (Sandbox Code Playgroud)
我知道这对你们中的一些人来说可能是愚蠢的,但是我在一个月左右的时间里写了一个程序而且我有时因为不知道该怎么办而感到沮丧.我尝试学习很多东西.如果这真的是一个愚蠢的问题,请原谅我.
还有,我想过
if(!($foo->findnodes('CommentsCorrectionList/CommentsCorrections[@RefType="Cites"]'))){
do foreach and get the data
}
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,如何避免foreach中的RefType ="Cites"并使其等于我想要的其他RefType.我的意思是我不知道是否可以在foreach语句中使用这样的布尔值.我试图找到并且也做了试验和错误,但手头没什么.任何帮助是极大的赞赏.
谢谢.
我有一个xml,我需要解析xml并遍历到最后一个孩子,XML将动态生成,所以我不知道XML的深度,我可以迭代xml直到它的最后一个孩子和兄弟姐妹(如果有的话).请帮助解决此问题:
我的代码片段是:
foreach my $childNodes ($root->findnodes('/'))
{
print $childNodes->nodePath;
print "\n";
if($childNodes->hasChildNodes)
{
foreach my $gChildNode ($camelid->childNodes)
{
print $gChildNode->nodePath;
print "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
这打印节点直到深度2但是如果深度是3我的意思是根有一个孩子和孩子我的代码打印它但是如果这里有另一个孩子代码将不打印并且无法猜测..我怎么能找到这个.
提前致谢.
我有一个非常简单的问题.我想找到XML分支的级别数.喜欢:
<span>
<span>
<math xmlns="http://www.w3.org/1998/Math/MathML" display="inline">
<msup>
<mn>34</mn>
<mi>o</mi>
</msup>
</math>
<span> </span>
</span>
</span>
Run Code Online (Sandbox Code Playgroud)
从第一个(根)span标记计算时,应该给出深度计数5.我正在使用XML :: Libxml.谢谢.
我有以下XML
<?xml version="1.0" encoding="UTF-8"?>
<Objects >
<Item1 elemId="id1" name="view" sort_id="3">
</Item1>
<Item2 elemId="id3" name="view" sort_id="4" >
</Item2>
<Item3 elemId="id5" name="view" sort_id="2">
</Item3>
<Item4 elemId="id9" name="view" sort_id="1">
</Item4>
</Objects>
Run Code Online (Sandbox Code Playgroud)
我想通过属性对该数据进行排序sort_id以获取以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<Objects >
<Item4 elemId="id9" name="view" sort_id="1">
</Item4>
<Item3 elemId="id5" name="view" sort_id="2">
</Item3>
<Item1 elemId="id1" name="view" sort_id="3">
</Item1>
<Item2 elemId="id3" name="view" sort_id="4" >
</Item2>
</Objects>
Run Code Online (Sandbox Code Playgroud)
我知道我不能这样做XML::Simple,但我听说我可以接受XML::LibXML。我找不到解决方案。
perl ×10
xml-libxml ×10
xml ×6
xpath ×4
libxml2 ×3
cpan ×1
module ×1
sorting ×1
windows ×1
xml-parsing ×1
xml-simple ×1