Привет, Может кто-нибудь помочь мне изменить ниже XML-документ на PHP.
Основная причина этого вопроса заключается в том, что я хотел добавить фиктивный узел XML с именем тега в качестве Service
для EVENT >> Body >> Services >> ServiceInstalls
Ниже представлен XML-документ
<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>
Я пробовал код таким образом, но я получаю ошибку
$ str – не что иное, как XML
$result = simplexml_load_string($str); $result = $result->xpath('/Event/Body/Services/ServiceChanges/ServiceInstalls'); $result = $result->addChild('Service',''); echo $result;
Ошибка
Неустранимая ошибка : вызов функции-члена addChild () для массива в C: \ xampp \ htdocs \ xhe2e \ info.php в строке 107
а строка 107 – $ result = $ result-> addChild ('Service', '');
Вы пропустили один тонкий предмет в своей попытке:
$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());
$sxe = new SimpleXMLElement($xmlstr); $result = $sxe->xpath('/Event/Body/Services/ServiceChanges/ServiceInstalls'); $result = $result[0]; $result = $result->addChild('Service','Dummy'); echo $sxe->asXML();
Я могу получить присоединенного ребенка таким образом