Reputation: 1276
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
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
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