使用Perl/LibXML获取子元素与条件匹配的XML父元素
我使用的是XML::LibXML(仅限于v1.58)。 多亏了in-post,我正确地获得了使用Perl/LibXML获取子元素与条件匹配的XML父元素,xml,perl,xml-libxml,Xml,Perl,Xml Libxml,我使用的是XML::LibXML(仅限于v1.58)。 多亏了in-post,我正确地获得了PROPERTY NAME=“NAME”ifCLASSNAME=“SharedGtTranslator”的值。 另外,我希望获得包含上述内容的整个VALUE.OBJECT父元素,并将其输出到另一个XML文件 因此,如果XML文件如下所示: <CIM CIMVERSION="2.0" DTDVERSION="2.0"> <DECLARATION> <DECLGRO
PROPERTY NAME=“NAME”
ifCLASSNAME=“SharedGtTranslator”
的值。
另外,我希望获得包含上述内容的整个VALUE.OBJECT
父元素,并将其输出到另一个XML文件
因此,如果XML文件如下所示:
<CIM CIMVERSION="2.0" DTDVERSION="2.0">
<DECLARATION>
<DECLGROUP>
<LOCALNAMESPACEPATH>
<NAMESPACE NAME="ecm"/>
</LOCALNAMESPACEPATH>
<!-- Ecm -->
<VALUE.OBJECT>
<INSTANCE CLASSNAME="Ecm">
<PROPERTY NAME="FileName" TYPE="string">
<VALUE>/opt/sign/log/ecm.log</VALUE>
</PROPERTY>
<PROPERTY NAME="Log" TYPE="sint32">
<VALUE>0</VALUE>
</PROPERTY>
<PROPERTY NAME="Name" TYPE="string">
<VALUE>ECM</VALUE>
</PROPERTY>
<PROPERTY NAME="TimerClaim" TYPE="sint32">
<VALUE>5000</VALUE>
</PROPERTY>
<PROPERTY NAME="TimerConnect" TYPE="sint32">
<VALUE>8000</VALUE>
</PROPERTY>
<PROPERTY NAME="TimerNegotiate" TYPE="sint32">
<VALUE>5000</VALUE>
</PROPERTY>
<PROPERTY NAME="TimerReconnect" TYPE="sint32">
<VALUE>500</VALUE>
</PROPERTY>
</INSTANCE>
</VALUE.OBJECT>
<VALUE.OBJECT>
<INSTANCE CLASSNAME="Ecm_Host">
<PROPERTY.REFERENCE NAME="Parent">
<VALUE.REFERENCE>
<INSTANCENAME CLASSNAME="Ecm">
<KEYBINDING NAME="Name">
<KEYVALUE>ECM</KEYVALUE>
</KEYBINDING>
</INSTANCENAME>
</VALUE.REFERENCE>
</PROPERTY.REFERENCE>
<PROPERTY.REFERENCE NAME="Child">
<VALUE.REFERENCE>
<INSTANCENAME CLASSNAME="Host">
<KEYBINDING NAME="Address">
<KEYVALUE>gtttcnss7v19</KEYVALUE>
</KEYBINDING>
</INSTANCENAME>
</VALUE.REFERENCE>
</PROPERTY.REFERENCE>
</INSTANCE>
</VALUE.OBJECT>
<VALUE.OBJECT>
<INSTANCE CLASSNAME="Ecm_ProcessClass">
<PROPERTY.REFERENCE NAME="Parent">
<VALUE.REFERENCE>
<INSTANCENAME CLASSNAME="Ecm">
<KEYBINDING NAME="Name">
<KEYVALUE>ECM</KEYVALUE>
</KEYBINDING>
</INSTANCENAME>
</VALUE.REFERENCE>
</PROPERTY.REFERENCE>
<PROPERTY.REFERENCE NAME="Child">
<VALUE.REFERENCE>
<INSTANCENAME CLASSNAME="ProcessClass">
<KEYBINDING NAME="ClassID">
<KEYVALUE>3</KEYVALUE>
</KEYBINDING>
</INSTANCENAME>
</VALUE.REFERENCE>
</PROPERTY.REFERENCE>
</INSTANCE>
</VALUE.OBJECT>
<VALUE.OBJECT>
<INSTANCE CLASSNAME="Ecm_ProcessClass">
<PROPERTY.REFERENCE NAME="Parent">
<VALUE.REFERENCE>
<INSTANCENAME CLASSNAME="Ecm">
<KEYBINDING NAME="Name">
<KEYVALUE>ECM</KEYVALUE>
</KEYBINDING>
</INSTANCENAME>
</VALUE.REFERENCE>
</PROPERTY.REFERENCE>
<PROPERTY.REFERENCE NAME="Child">
<VALUE.REFERENCE>
<INSTANCENAME CLASSNAME="ProcessClass">
<KEYBINDING NAME="ClassID">
<KEYVALUE>1</KEYVALUE>
</KEYBINDING>
</INSTANCENAME>
</VALUE.REFERENCE>
</PROPERTY.REFERENCE>
</INSTANCE>
</VALUE.OBJECT>
<VALUE.OBJECT>
<INSTANCE CLASSNAME="Ecm_ProcessClass">
<PROPERTY.REFERENCE NAME="Parent">
<VALUE.REFERENCE>
<INSTANCENAME CLASSNAME="Ecm">
<KEYBINDING NAME="Name">
<KEYVALUE>ECM</KEYVALUE>
</KEYBINDING>
</INSTANCENAME>
</VALUE.REFERENCE>
</PROPERTY.REFERENCE>
<PROPERTY.REFERENCE NAME="Child">
<VALUE.REFERENCE>
<INSTANCENAME CLASSNAME="ProcessClass">
<KEYBINDING NAME="ClassID">
<KEYVALUE>15</KEYVALUE>
</KEYBINDING>
</INSTANCENAME>
</VALUE.REFERENCE>
</PROPERTY.REFERENCE>
</INSTANCE>
</VALUE.OBJECT>
<VALUE.OBJECT>
<INSTANCE CLASSNAME="SharedGtTranslator">
<QUALIFIER NAME="Configstate" TYPE="string">
<VALUE>planned</VALUE>
</QUALIFIER>
<PROPERTY NAME="Name" TYPE="string">
<VALUE>HLR$4,0,1,3,7240*-->HLR HLR LocalSPC: 410 SSN: 6</VALUE>
</PROPERTY>
<PROPERTY NAME="NatureOfAddress" TYPE="sint32">
<VALUE>3</VALUE>
</PROPERTY>
<PROPERTY NAME="NetworkID" TYPE="sint32">
<VALUE>1</VALUE>
</PROPERTY>
<PROPERTY NAME="NumberSeries" TYPE="sint32">
<VALUE>7240*</VALUE>
</PROPERTY>
<PROPERTY NAME="NumberingPlan" TYPE="sint32">
<VALUE>1</VALUE>
</PROPERTY>
<PROPERTY NAME="TranslationType" TYPE="sint32">
<VALUE>0</VALUE>
</PROPERTY>
</INSTANCE>
</VALUE.OBJECT>
<VALUE.OBJECT>
<INSTANCE CLASSNAME="SharedGtTranslator">
<QUALIFIER NAME="Configstate" TYPE="string">
<VALUE>planned</VALUE>
</QUALIFIER>
<PROPERTY NAME="Name" TYPE="string">
<VALUE>HLR$4,0,1,3,7250*-->HLR HLR LocalSPC: 410 SSN: 6</VALUE>
</PROPERTY>
<PROPERTY NAME="NatureOfAddress" TYPE="sint32">
<VALUE>3</VALUE>
</PROPERTY>
<PROPERTY NAME="NetworkID" TYPE="sint32">
<VALUE>1</VALUE>
</PROPERTY>
<PROPERTY NAME="NumberSeries" TYPE="sint32">
<VALUE>7250*</VALUE>
</PROPERTY>
<PROPERTY NAME="NumberingPlan" TYPE="sint32">
<VALUE>1</VALUE>
</PROPERTY>
<PROPERTY NAME="TranslationType" TYPE="sint32">
<VALUE>0</VALUE>
</PROPERTY>
</INSTANCE>
</VALUE.OBJECT>
</DECLGROUP>
</DECLARATION>
</CIM>
/opt/sign/log/ecm.log
0
电解加工
5000
8000
5000
500
电解加工
gtttcnss7v19
电解加工
3.
电解加工
1.
电解加工
15
计划
HLR$4,0,1,37240*-->HLR本地SPC:410 SSN:6
3.
1.
7240*
1.
0
计划
HLR$4,0,1,37250*-->HLR本地SPC:410 SSN:6
3.
1.
7250*
1.
0
新文件将仅包含以下内容:
<CIM>
<DECLARATION>
<DECLGROUP>
<VALUE.OBJECT>
<INSTANCE CLASSNAME="SharedGtTranslator">
<QUALIFIER NAME="Configstate" TYPE="string">
<VALUE>planned</VALUE>
</QUALIFIER>
<PROPERTY NAME="Name" TYPE="string">
<VALUE>HLR$4,0,1,3,7240*-->HLR HLR LocalSPC: 410 SSN: 6</VALUE>
</PROPERTY>
<PROPERTY NAME="NatureOfAddress" TYPE="sint32">
<VALUE>3</VALUE>
</PROPERTY>
<PROPERTY NAME="NetworkID" TYPE="sint32">
<VALUE>1</VALUE>
</PROPERTY>
<PROPERTY NAME="NumberSeries" TYPE="sint32">
<VALUE>7240*</VALUE>
</PROPERTY>
<PROPERTY NAME="NumberingPlan" TYPE="sint32">
<VALUE>1</VALUE>
</PROPERTY>
<PROPERTY NAME="TranslationType" TYPE="sint32">
<VALUE>0</VALUE>
</PROPERTY>
</INSTANCE>
</VALUE.OBJECT>
<VALUE.OBJECT>
<INSTANCE CLASSNAME="SharedGtTranslator">
<QUALIFIER NAME="Configstate" TYPE="string">
<VALUE>planned</VALUE>
</QUALIFIER>
<PROPERTY NAME="Name" TYPE="string">
<VALUE>HLR$4,0,1,3,7250*-->HLR HLR LocalSPC: 410 SSN: 6</VALUE>
</PROPERTY>
<PROPERTY NAME="NatureOfAddress" TYPE="sint32">
<VALUE>3</VALUE>
</PROPERTY>
<PROPERTY NAME="NetworkID" TYPE="sint32">
<VALUE>1</VALUE>
</PROPERTY>
<PROPERTY NAME="NumberSeries" TYPE="sint32">
<VALUE>7250*</VALUE>
</PROPERTY>
<PROPERTY NAME="NumberingPlan" TYPE="sint32">
<VALUE>1</VALUE>
</PROPERTY>
<PROPERTY NAME="TranslationType" TYPE="sint32">
<VALUE>0</VALUE>
</PROPERTY>
</INSTANCE>
</VALUE.OBJECT>
</DECLGROUP>
</DECLARATION>
</CIM>
计划
HLR$4,0,1,37240*-->HLR本地SPC:410 SSN:6
3.
1.
7240*
1.
0
计划
HLR$4,0,1,37250*-->HLR本地SPC:410 SSN:6
3.
1.
7250*
1.
0
如果您需要VALUE.OBJECT
结构,那么我建议您首先找到这些结构,然后在它们内部查找提供名称的属性
元素
此代码支持此想法。它查找数据中所有VALUE.OBJECT
元素,这些元素的实例
子元素的CLASSNAME
属性等于SharedGtTranslator
。对于这些元素中的任何一个,使用toString
显示整个元素的XML,通过查找实例
子元素,然后查找属性
属性等于名称
的子元素的属性
来查找和显示名称
我还改变了从文件中解析数据的方式,正如您所说,您使用的XML::LibXML
版本没有load\u XML
方法
请注意,findnodes
方法将始终返回节点列表,如果调用在列表上下文中,则返回Perl列表;如果调用在scdalar上下文中,则返回XML::LibXML::NodeList
对象。无论XPath表达式有多个、一个或零个匹配项,这都是正确的,如果您有任何疑问,应该在继续处理之前检查找到的节点数
use strict;
use warnings;
use XML::LibXML;
my $doc = XML::LibXML->new(no_blanks => 1)->parse_file($file1);
my @value_objects = $doc->findnodes('//VALUE.OBJECT[INSTANCE[@CLASSNAME = "SharedGtTranslator"]]');
for my $value_object (@value_objects) {
print "\n";
print $value_object->toString(1), "\n";
print "\n";
my @names = $value_object->findnodes('INSTANCE/PROPERTY[@NAME = "Name"]');
print $names[0]->textContent, "\n";
}
如果您需要
VALUE.OBJECT
结构,那么我建议您首先找到这些结构,然后在它们内部查找提供名称的属性
元素
此代码支持此想法。它查找数据中所有VALUE.OBJECT
元素,这些元素的实例
子元素的CLASSNAME
属性等于SharedGtTranslator
。对于这些元素中的任何一个,使用toString
显示整个元素的XML,通过查找实例
子元素,然后查找属性
属性等于名称
的子元素的属性
来查找和显示名称
我还改变了从文件中解析数据的方式,正如您所说,您使用的XML::LibXML
版本没有load\u XML
方法
请注意,findnodes
方法将始终返回节点列表,如果调用在列表上下文中,则返回Perl列表,或者返回XML: