转储XML文件元素和属性



我想从XML文件中打印所有元素及其属性名称和值。

<UTILITYBILLS>
  <BillingMessage>Bill Message TEST</BillingMessage>
  <StubMessage>Stub Message TEST</StubMessage>
  <PaymentCodeID>34</PaymentCodeID>
  <DueDate>08/01/2016</DueDate>
  <ScheduledPrintDate>07/04/2016</ScheduledPrintDate>
  <ActualPrintDate>07/07/2016</ActualPrintDate>
  <ActualPrintTime>9:37 AM</ActualPrintTime>
  <BILL AccountNumber="0390124-000" AccountType="Mayesville- Residential" UtilityAccountID="14242">
    <ConsumptionHistory>dfgdfg</ConsumptionHistory>
    <SERVICE Service=""/>
    <BILLINGITEMS BillingItemCode=""/>
    <CHARGES ChargeCategoryDescription="MAYESEVILLE CHARGES" Amount="70.09" Parent="1"/>
    <CHARGES ChargeCategoryDescription="MA - WATER" Amount="43.04" Parent="0">
      <LineItemDetail UtilityTransDetailID="6605683" ComponentType="Flat Rate" ComponentDescription="WATER MIN"/>
      <LineItemDetail UtilityTransDetailID="6606886" ComponentType="Block Rate" ComponentDescription="WATER CONS">
        <LIDetailConsumption MeterNumber="36313595" MeterType="Water &amp; Sewer 9" ServiceClassCode="Water &amp; Sewer" MeasurementTypeSequence="1"/>
      </LineItemDetail>
      <LineItemDetail UtilityTransDetailID="6606890" ComponentType="Block Rate" ComponentDescription="WATER CONS">
        <LIDetailConsumption MeterNumber="36313595" MeterType="Water &amp; Sewer 9" ServiceClassCode="Water &amp; Sewer" MeasurementTypeSequence="1"/>
      </LineItemDetail>
    </CHARGES>
    <CHARGES ChargeCategoryDescription="MA - SEWER" Amount="27.05" Parent="0">
      <LineItemDetail UtilityTransDetailID="6605685" ComponentType="Flat Rate" ComponentDescription="SEWER MINIMUM"/>
      <LineItemDetail UtilityTransDetailID="6606894" ComponentType="Block Rate" ComponentDescription="SEWER CONS">
        <LIDetailConsumption MeterNumber="36313595" MeterType="Water &amp; Sewer 9" ServiceClassCode="Water &amp; Sewer" MeasurementTypeSequence="1"/>
      </LineItemDetail>
    </CHARGES>
    <CONSUMPTION ServiceClass="Water &amp; Sewer" MeterType="Water &amp; Sewer 9" MeterNumber="36313595"/>
  </BILL>
  <BILL AccountNumber="0390124-000" AccountType="Mayesville- Residential" UtilityAccountID="14242">
    <ConsumptionHistory>dfgdfg</ConsumptionHistory>
    <SERVICE Service=""/>
    <BILLINGITEMS BillingItemCode=""/>
    <CHARGES ChargeCategoryDescription="MAYESEVILLE CHARGES" Amount="70.09" Parent="1"/>
    <CHARGES ChargeCategoryDescription="MA - WATER" Amount="43.04" Parent="0">
      <LineItemDetail UtilityTransDetailID="6605683" ComponentType="Flat Rate" ComponentDescription="WATER MIN"/>
      <LineItemDetail UtilityTransDetailID="6606886" ComponentType="Block Rate" ComponentDescription="WATER CONS">
        <LIDetailConsumption MeterNumber="36313595" MeterType="Water &amp; Sewer 9" ServiceClassCode="Water &amp; Sewer" MeasurementTypeSequence="1"/>
      </LineItemDetail>
      <LineItemDetail UtilityTransDetailID="6606890" ComponentType="Block Rate" ComponentDescription="WATER CONS">
        <LIDetailConsumption MeterNumber="36313595" MeterType="Water &amp; Sewer 9" ServiceClassCode="Water &amp; Sewer" MeasurementTypeSequence="1"/>
      </LineItemDetail>
    </CHARGES>
    <CHARGES ChargeCategoryDescription="MA - SEWER" Amount="27.05" Parent="0">
      <LineItemDetail UtilityTransDetailID="6605685" ComponentType="Flat Rate" ComponentDescription="SEWER MINIMUM"/>
      <LineItemDetail UtilityTransDetailID="6606894" ComponentType="Block Rate" ComponentDescription="SEWER CONS">
        <LIDetailConsumption MeterNumber="36313595" MeterType="Water &amp; Sewer 9" ServiceClassCode="Water &amp; Sewer" MeasurementTypeSequence="1"/>
      </LineItemDetail>
    </CHARGES>
    <CONSUMPTION ServiceClass="Water &amp; Sewer" MeterType="Water &amp; Sewer 9" MeterNumber="36313595"/>
  </BILL>
  <BILL AccountNumber="0390124-000" AccountType="Mayesville- Residential" UtilityAccountID="14242">
    <ConsumptionHistory>dfgdfg</ConsumptionHistory>
    <SERVICE Service=""/>
    <BILLINGITEMS BillingItemCode=""/>
    <CHARGES ChargeCategoryDescription="MAYESEVILLE CHARGES" Amount="70.09" Parent="1"/>
    <CHARGES ChargeCategoryDescription="MA - WATER" Amount="43.04" Parent="0">
      <LineItemDetail UtilityTransDetailID="6605683" ComponentType="Flat Rate" ComponentDescription="WATER MIN"/>
      <LineItemDetail UtilityTransDetailID="6606886" ComponentType="Block Rate" ComponentDescription="WATER CONS">
        <LIDetailConsumption MeterNumber="36313595" MeterType="Water &amp; Sewer 9" ServiceClassCode="Water &amp; Sewer" MeasurementTypeSequence="1"/>
      </LineItemDetail>
      <LineItemDetail UtilityTransDetailID="6606890" ComponentType="Block Rate" ComponentDescription="WATER CONS">
        <LIDetailConsumption MeterNumber="36313595" MeterType="Water &amp; Sewer 9" ServiceClassCode="Water &amp; Sewer" MeasurementTypeSequence="1"/>
      </LineItemDetail>
    </CHARGES>
    <CHARGES ChargeCategoryDescription="MA - SEWER" Amount="27.05" Parent="0">
      <LineItemDetail UtilityTransDetailID="6605685" ComponentType="Flat Rate" ComponentDescription="SEWER MINIMUM"/>
      <LineItemDetail UtilityTransDetailID="6606894" ComponentType="Block Rate" ComponentDescription="SEWER CONS">
        <LIDetailConsumption MeterNumber="36313595" MeterType="Water &amp; Sewer 9" ServiceClassCode="Water &amp; Sewer" MeasurementTypeSequence="1"/>
      </LineItemDetail>
    </CHARGES>
    <CONSUMPTION ServiceClass="Water &amp; Sewer" MeterType="Water &amp; Sewer 9" MeterNumber="36313595"/>
  </BILL>
</UTILITYBILLS>

上面的文件是sample.xml,我正在尝试获取每个元素、它的值以及每个子级和子级及其值。

这是我的密码。

use XML::LibXML;
my $file   = "sample.xml";
my $parser = XML::LibXML->new();
my $xmldoc = $parser->parse_file($file);
for my $sample ( $xmldoc->getElementsByTagName('UTILITYBILLS') ) {
    for my $property ( $sample->findnodes('./*') ) {
        print OUT $property->nodeName(), ": ", $property->textContent(), "n";
        my @attributeslist = $property->attributes();
        foreach my $value (@attributeslist) {
            my $string = $value->getValue();
            print OUT $value->nodeName(), ": ", "$string", "n";
        }
    }
}

我的代码输出如下:

BillingMessage: Bill Message TEST
StubMessage: Stub Message TEST
PaymentCodeID: 34
DueDate: 08/01/2016
ScheduledPrintDate: 07/04/2016
ActualPrintDate: 07/07/2016
ActualPrintTime: 9:37 AM
BILL: 
    dfgdfg     

AccountNumber: 0390124-000
AccountType: Mayesville- Residential
UtilityAccountID: 14242
BILL: 
    dfgdfg     

AccountNumber: 0390124-000
AccountType: Mayesville- Residential
UtilityAccountID: 14242
BILL: 
    dfgdfg     

AccountNumber: 0390124-000
AccountType: Mayesville- Residential
UtilityAccountID: 14242

我想要如下的输出

BillingMessage: Bill Message TEST
StubMessage: Stub Message TEST
PaymentCodeID: 34
DueDate: 08/01/2016
ScheduledPrintDate: 07/04/2016
ActualPrintDate: 07/07/2016
ActualPrintTime: 9:37 AM
BILL: 
ConsumptionHistory: dfgdfg  
AccountNumber: 0390124-000
AccountType: Mayesville- Residential
UtilityAccountID: 14242
And all sub child attributes and it's value
.
.
.
BillingMessage: Bill Message TEST
StubMessage: Stub Message TEST
PaymentCodeID: 34
DueDate: 08/01/2016
ScheduledPrintDate: 07/04/2016
ActualPrintDate: 07/07/2016
ActualPrintTime: 9:37 AM
BILL: 
    ConsumptionHistory: dfgdfg 
AccountNumber: 0390124-000
AccountType: Mayesville- Residential
UtilityAccountID: 14242
And all sub child attributes and it's value
.
.
.

请帮我解决这个问题。

只转储所有节点名称及其值是一个奇怪的要求。这样你就失去了所有的关系信息,但嘿,如果这是你想要的

问题是textContent返回所有子文本节点,而不是仅返回直接子文本节点

我想这正是你想要的

use strict;
use warnings 'all';
use XML::LibXML;
my $file = 'UTILITYBILLS.xml';
my $doc = XML::LibXML->load_xml( location => $file );
for my $bill ($doc->findnodes('/UTILITYBILLS/BILL')) {
    for my $property ( $bill->findnodes('.//*') ) {
        printf "%s:n", $property->nodeName;
        for my $text ( $property->findnodes('text()') ) {
            $text = $text->data =~ s/As+|s+z//gr;
            print "    $textn" if $text;
        }
        for my $attr ( $property->attributes ) {
            printf qq{    %s="%s"n}, $attr->nodeName, $attr->value;
        }      
    }
    print "nn";
}

输出

ConsumptionHistory:
    dfgdfg
SERVICE:
    Service=""
BILLINGITEMS:
    BillingItemCode=""
CHARGES:
    ChargeCategoryDescription="MAYESEVILLE CHARGES"
    Amount="70.09"
    Parent="1"
CHARGES:
    ChargeCategoryDescription="MA - WATER"
    Amount="43.04"
    Parent="0"
LineItemDetail:
    UtilityTransDetailID="6605683"
    ComponentType="Flat Rate"
    ComponentDescription="WATER MIN"
LineItemDetail:
    UtilityTransDetailID="6606886"
    ComponentType="Block Rate"
    ComponentDescription="WATER CONS"
LIDetailConsumption:
    MeterNumber="36313595"
    MeterType="Water & Sewer 9"
    ServiceClassCode="Water & Sewer"
    MeasurementTypeSequence="1"
LineItemDetail:
    UtilityTransDetailID="6606890"
    ComponentType="Block Rate"
    ComponentDescription="WATER CONS"
LIDetailConsumption:
    MeterNumber="36313595"
    MeterType="Water & Sewer 9"
    ServiceClassCode="Water & Sewer"
    MeasurementTypeSequence="1"
CHARGES:
    ChargeCategoryDescription="MA - SEWER"
    Amount="27.05"
    Parent="0"
LineItemDetail:
    UtilityTransDetailID="6605685"
    ComponentType="Flat Rate"
    ComponentDescription="SEWER MINIMUM"
LineItemDetail:
    UtilityTransDetailID="6606894"
    ComponentType="Block Rate"
    ComponentDescription="SEWER CONS"
LIDetailConsumption:
    MeterNumber="36313595"
    MeterType="Water & Sewer 9"
    ServiceClassCode="Water & Sewer"
    MeasurementTypeSequence="1"
CONSUMPTION:
    ServiceClass="Water & Sewer"
    MeterType="Water & Sewer 9"
    MeterNumber="36313595"

ConsumptionHistory:
    dfgdfg
SERVICE:
    Service=""
BILLINGITEMS:
    BillingItemCode=""
CHARGES:
    ChargeCategoryDescription="MAYESEVILLE CHARGES"
    Amount="70.09"
    Parent="1"
CHARGES:
    ChargeCategoryDescription="MA - WATER"
    Amount="43.04"
    Parent="0"
LineItemDetail:
    UtilityTransDetailID="6605683"
    ComponentType="Flat Rate"
    ComponentDescription="WATER MIN"
LineItemDetail:
    UtilityTransDetailID="6606886"
    ComponentType="Block Rate"
    ComponentDescription="WATER CONS"
LIDetailConsumption:
    MeterNumber="36313595"
    MeterType="Water & Sewer 9"
    ServiceClassCode="Water & Sewer"
    MeasurementTypeSequence="1"
LineItemDetail:
    UtilityTransDetailID="6606890"
    ComponentType="Block Rate"
    ComponentDescription="WATER CONS"
LIDetailConsumption:
    MeterNumber="36313595"
    MeterType="Water & Sewer 9"
    ServiceClassCode="Water & Sewer"
    MeasurementTypeSequence="1"
CHARGES:
    ChargeCategoryDescription="MA - SEWER"
    Amount="27.05"
    Parent="0"
LineItemDetail:
    UtilityTransDetailID="6605685"
    ComponentType="Flat Rate"
    ComponentDescription="SEWER MINIMUM"
LineItemDetail:
    UtilityTransDetailID="6606894"
    ComponentType="Block Rate"
    ComponentDescription="SEWER CONS"
LIDetailConsumption:
    MeterNumber="36313595"
    MeterType="Water & Sewer 9"
    ServiceClassCode="Water & Sewer"
    MeasurementTypeSequence="1"
CONSUMPTION:
    ServiceClass="Water & Sewer"
    MeterType="Water & Sewer 9"
    MeterNumber="36313595"

ConsumptionHistory:
    dfgdfg
SERVICE:
    Service=""
BILLINGITEMS:
    BillingItemCode=""
CHARGES:
    ChargeCategoryDescription="MAYESEVILLE CHARGES"
    Amount="70.09"
    Parent="1"
CHARGES:
    ChargeCategoryDescription="MA - WATER"
    Amount="43.04"
    Parent="0"
LineItemDetail:
    UtilityTransDetailID="6605683"
    ComponentType="Flat Rate"
    ComponentDescription="WATER MIN"
LineItemDetail:
    UtilityTransDetailID="6606886"
    ComponentType="Block Rate"
    ComponentDescription="WATER CONS"
LIDetailConsumption:
    MeterNumber="36313595"
    MeterType="Water & Sewer 9"
    ServiceClassCode="Water & Sewer"
    MeasurementTypeSequence="1"
LineItemDetail:
    UtilityTransDetailID="6606890"
    ComponentType="Block Rate"
    ComponentDescription="WATER CONS"
LIDetailConsumption:
    MeterNumber="36313595"
    MeterType="Water & Sewer 9"
    ServiceClassCode="Water & Sewer"
    MeasurementTypeSequence="1"
CHARGES:
    ChargeCategoryDescription="MA - SEWER"
    Amount="27.05"
    Parent="0"
LineItemDetail:
    UtilityTransDetailID="6605685"
    ComponentType="Flat Rate"
    ComponentDescription="SEWER MINIMUM"
LineItemDetail:
    UtilityTransDetailID="6606894"
    ComponentType="Block Rate"
    ComponentDescription="SEWER CONS"
LIDetailConsumption:
    MeterNumber="36313595"
    MeterType="Water & Sewer 9"
    ServiceClassCode="Water & Sewer"
    MeasurementTypeSequence="1"
CONSUMPTION:
    ServiceClass="Water & Sewer"
    MeterType="Water & Sewer 9"
    MeterNumber="36313595"

相关内容

  • 没有找到相关文章

最新更新