1

I'm using XML::LibXML (limited to v1.58). Thanks to Borodin in this post i'm correctly getting the values for PROPERTY NAME="Name" if CLASSNAME="SharedGtTranslator". What I would additionaly like is get the whole VALUE.OBJECT parent element that contains the above mentioned, and output it to another XML file.

So if the XML file looks like this:

<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>

The new file would contain only this:

<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>
Community
  • 1
  • 1
vobelic
  • 51
  • 1
  • 5
  • Seems I found my answer [here](http://stackoverflow.com/questions/7222637/xmllibxmls-notion-of-a-text-nodes-parent) – vobelic Apr 24 '13 at 12:56

1 Answers1

1

If you need the VALUE.OBJECT structures then I suggest you find these first, and then look inside them for the PROPERTY element that gives you the name.

This code shoes the idea. It finds all VALUE.OBJECT elements in the data that have an INSTANCE child with a CLASSNAME attribute equal to SharedGtTranslator. For of these elements, the XML of entire element is displayed using toString, and the name is found and displayed by looking for the INSTANCE child and then the PROPERTY child of that that has a NAME attribute equal to Name.

I have also changed the way that the data is parsed from the file as you say you are stuck with a version of XML::LibXML that has no load_xml method.

Note that the findnodes method will always return a list of nodes, either as a Perl list if the call is in list context, or as a XML::LibXML::NodeList object if it is in scdalar context. This is true whether there are many, one, or zero matches to the XPath expression, and if you have any doubts at all you should check the number of nodes found before processing continues.

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";
}
Borodin
  • 126,100
  • 9
  • 70
  • 144