Mahesh G
Mahesh G

Reputation: 1276

Appending XML node in PHP

Hi Can someone help me modifying below XML document in PHP.

The main reason for this question is I wanted to append a dummy XML node with tag name as Service to the EVent>>Body>>Services>>ServiceInstalls

Below is the XML document

<Event>
    <Header>
        <EventSource>TXT</EventSource>
    </Header>
    <Body>
        <Services>
            <CurrentServices>
                <Service serviceID = "SS014">
                    <ServiceChangeActivity>NoChange</ServiceChangeActivity>
                    <TelephoneNumbers>
                        <TN></TN>
                    </TelephoneNumbers>
                    <Rate>0.00</Rate>
                    <Desc>Auto</Desc>
                    <Count>1</Count>
                    <LOB>XHS</LOB>
                    <PackageCode>Test</PackageCode>
                    <EPCServiceDef>
                        <EPCProduct pn = "10300029">
                            <Name>Auto</Name>
                            <LongDescription>Auto SERVICE</LongDescription>
                            <Type>Service</Type>
                            <LOB>Video</LOB>
                        </EPCProduct>
                    </EPCServiceDef>
                    <Type>S</Type>
                    <TypeClassification>S</TypeClassification>
                    <SubType>04</SubType>
                    <Status>C</Status>
                    <Provisionable>N</Provisionable>
                    <BillCode>Auto</BillCode>
                    <BillCodeDescription>Auto</BillCodeDescription>
                    <Outlet></Outlet>
                    <Port></Port>
                    <BeforeQuantity>1</BeforeQuantity>
                    <Quantity>1</Quantity>
                    <ConnectDate>2016-12-19</ConnectDate>
                    <CompleteIndicator>C</CompleteIndicator>
                </Service>
                <Service serviceID = "BA">
                    <ServiceChangeActivity>NoChange</ServiceChangeActivity>
                    <TelephoneNumbers>
                        <TN></TN>
                    </TelephoneNumbers>
                    <Rate>0.00</Rate>
                    <TXTServiceBilling>
                        <BeginDate>2016-12-19T00:00:00.000Z</BeginDate>
                        <Discount></Discount>
                        <DiscountDescription/>
                        <CustomerDiscount></CustomerDiscount>
                        <CustomerDiscountDescription/>
                        <DiscountGroup/>
                        <DiscountGroupBeginDate/>
                        <Charge>0.00</Charge>
                        <ChargeType>R</ChargeType>
                        <ChargeMethod></ChargeMethod>
                        <Hold/>
                    </TXTServiceBilling>
                    <Desc>Basic</Desc>
                    <Count>1</Count>
                    <LOB>Video</LOB>
                    <PackageCode>BA</PackageCode>
                    <EPCServiceDef>
                        <EPCProduct pn = "Auto">
                            <Name>Basic Video (B1)</Name>
                            <LongDescription>BASIC VIDEO</LongDescription>
                            <Type>Service</Type>
                            <LOB>Video</LOB>
                        </EPCProduct>
                    </EPCServiceDef>
                    <Type>S</Type>
                    <TypeClassification>S</TypeClassification>
                    <SubType>01</SubType>
                    <Status>C</Status>
                    <Provisionable>N</Provisionable>
                    <BillCode>BA</BillCode>
                    <BillCodeDescription>Basic</BillCodeDescription>
                    <Outlet></Outlet>
                    <Port></Port>
                    <BeforeQuantity>1</BeforeQuantity>
                    <Quantity>1</Quantity>
                    <ConnectDate>2016-12-19</ConnectDate>
                    <CompleteIndicator>C</CompleteIndicator>
                    <TXTServiceIdentifier>3</TXTServiceIdentifier>
                </Service>
            </CurrentServices>
            <ServiceChanges>
                <ServiceInstalls>
                    <Service serviceID = "SSSS">
                        <ServiceChangeActivity>Install</ServiceChangeActivity>
                        <Desc>SSSS</Desc>
                        <LOB>Other</LOB>
                        <TXTServiceIdentifier>4</TXTServiceIdentifier>
                    </Service>
                </ServiceInstalls>
                <ServiceDisconnects/>
            </ServiceChanges>
        </Services>
    </Body>
</Event>

I have tried the code as this way but I am getting error

$str is nothing but above XML

$result = simplexml_load_string($str);
$result = $result->xpath('/Event/Body/Services/ServiceChanges/ServiceInstalls');
$result = $result->addChild('Service','');

echo $result;

Error is


Fatal error: Call to a member function addChild() on array in C:\xampp\htdocs\xhe2e\info.php on line 107
and line 107 is $result = $result->addChild('Service','');

Upvotes: 2

Views: 108

Answers (2)

Mahesh G
Mahesh G

Reputation: 1276

$sxe = new SimpleXMLElement($xmlstr);
$result = $sxe->xpath('/Event/Body/Services/ServiceChanges/ServiceInstalls');
$result = $result[0];
$result = $result->addChild('Service','Dummy');

echo $sxe->asXML();

I am able to get the appended child using this way

Upvotes: 0

random_user_name
random_user_name

Reputation: 26160

You missed one subtle item in your attempt:

$result = simplexml_load_string($str);
$result = $result->xpath('/Event/Body/Services/ServiceChanges/ServiceInstalls');
// $result should now be an array.  Check to be sure:
if ( $result && is_array( $result ) ) {
    // since it IS an array, set to the first element of the array
    $result = $result[0];
    // And NOW we can append
    $result = $result->addChild('Service','');
}

// The part from here is only to make the output pretty-xml
// instead you can just use $result->saveXML()
$dom = new DOMDocument("1.0");
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($result->saveXML());
var_dump($dom->saveXML());

Upvotes: 1

Related Questions