在PHP中附加XML节点

时间:2016-12-28 15:53:37

标签: php xml

嗨有人可以帮我修改PHP下面的XML文档。

这个问题的主要原因是我想在EVent>> Body>>服务>> ServiceInstalls

中添加标记名为Service的虚拟XML节点

以下是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;

错误是


致命错误:在 107 C:\ xampp \ htdocs \ xhe2e \ info.php 上的数组上调用成员函数addChild()
第107行是$ result = $ result-&gt; addChild(&#39;服务&#39;,&#39;&#39;);

2 个答案:

答案 0 :(得分:1)

你错过了一个微妙的项目:

$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());

答案 1 :(得分:0)

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

echo $sxe->asXML();

我能够以这种方式获得附加的孩子