PHP-如何从包含XML结构的变量中删除某些特定元素?

PHP-如何从包含XML结构的变量中删除某些特定元素?,php,xml,Php,Xml,我有一个字段$xml,其中包含一些xml值。首先,我必须指出,元素并没有在新行(row)中分开,而是像没有新行的字符串一样绑定在一起 我将首先展示XML结构,它看起来很容易“可读” 支付 ADSL 4 平衡 0 支付 支付 但我必须再次指出,$xml字段中的实际值不太容易读取。 例如,它看起来像这样 <?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv=" http://schemas.x

我有一个字段
$xml
,其中包含一些xml值。首先,我必须指出,元素并没有在新行(row)中分开,而是像没有新行的字符串一样绑定在一起

我将首先展示XML结构,它看起来很容易“可读”


支付
ADSL 4
平衡
0
支付
支付
但我必须再次指出,$xml字段中的实际值不太容易读取。 例如,它看起来像这样

<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv=" http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><p:queryBillingAccountResponse xmlns:p=" http://www.ibm.com">.......
。。。。。。。
我想删除元素:
?xmlversion
soapenv:Envelope
soapenv:Body
及其属性。我想在beggining和xml值的末尾删除它们。其他一切保持原状1如何实现这一点?所以我在php字段中的新值应该从
queryBillingAccountResponse
元素开始。谢谢

您可以使用ereg_替换


使用regex标识要删除的元素。

对于有效的XML,可以使用
SimpeXML
DOMDocument
查询body元素的子节点

$xml = '<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <p:queryBillingAccountResponse xmlns:p="http://www.ibm.com">
            <ns0:customerAccount xmlns:ns0="http://www.ibm.com/xmlns/">
                <AccountStatus>Paid</AccountStatus>
                <ComponentCustomerAccount>
                    <Name>ADSL 4</Name>
                    <CharacteristicValue>
                        <Characteristic>
                            <Name>Balance</Name>
                        </Characteristic>
                        <Value>0.0</Value>
                    </CharacteristicValue>
                    <AccountStatus>Paid</AccountStatus>
                </ComponentCustomerAccount>
            </ns0:customerAccount>
        </p:queryBillingAccountResponse>
    </soapenv:Body>
</soapenv:Envelope>';

$xml = simplexml_load_string($xml);
$xml = $xml->xpath('//soapenv:Body/child::*')[0];
echo $xml->asXML();
$xml='1!'
支付
ADSL 4
平衡
0
支付
';
$xml=simplexml\u load\u字符串($xml);
$xml=$xml->xpath('//soapenv:Body/child::*')[0];
echo$xml->asXML();
结果是:

<p:queryBillingAccountResponse xmlns:p="http://www.ibm.com">
    <ns0:customerAccount xmlns:ns0="http://www.ibm.com/xmlns/">
        <AccountStatus>Paid</AccountStatus>
        <ComponentCustomerAccount>
            <Name>ADSL 4</Name>
            <CharacteristicValue>
                <Characteristic>
                    <Name>Balance</Name>
                </Characteristic>
                <Value>0.0</Value>
            </CharacteristicValue>
            <AccountStatus>Paid</AccountStatus>
        </ComponentCustomerAccount>
    </ns0:customerAccount>
</p:queryBillingAccountResponse>

支付
ADSL 4
平衡
0
支付

但问题是您的XML无效,我不知道这是否是复制粘贴错误。

这是XSLT最简单、最简单的方法:

function extract\u body\u stripns($xmlstring){
静态$xsl=NULL;
如果($xsl==NULL){
$xsl_soap_body_nons=loadXML($xmlstring,LIBXML_COMPACT | LIBXML_NONET);
$newd=$xsl->transformToDoc($d);
未结算(d美元);
返回$newd->saveXML($newd->documentElement);
}
使用此功能:

echo-extract\u-body\u-stripns($xmlString);
结果是:


ADSL 4
平衡
0
支付

请注意,如果您的源文档中有名称空间属性,则剥离名称空间的过程可能会导致您丢失其中一些属性。例如,对于元素
,您的一个属性将丢失,而丢失的属性并不一致!

ereg\ucode>函数自PHP 5.3以来就已被弃用,但即使是使用正则表达式进行html/xml解析非常重要。感谢answe。为什么您认为它不可用?也许我没有看到解析错误?我应该安装这个$xml=simplexml\u load\u字符串($xml);使用新的simplexmlelement???您的XML无效,因为它在结束标记的末尾包含额外的内容。此外,命名空间URL前的空格无效。您的意思是:shoudl I instatiate this$XML=simplexml\u load\u string($XML);对于新的simplexmlelement,这是一个包含xml值的字符串字段,所以我的意思是,在我可以使用其他函数进一步解析xml之前,我应该先用新的simplexmlelement初始化它。(例如,我以后需要对每个函数进行进一步解析)。所以我的问题是,这是否足够simplexml\u load\u string($xml);若要在该字符串字段中生成xml格式?谢谢函数
simplexml\u load\u string
返回一个
simplexmlement
实例。现在可以使用该实例遍历xml。因此,第一步应该是:从xml字符串创建一个
simplexmlement
实例。然后使用xpat选择主体的子节点h、 正如我在我的示例中所描述的。
$xml->xpath('//soapenv:Body/child::*')
为您提供了一个
simplexmlement
实例数组。因此,您可以迭代这些实例来对xml进行进一步处理$xml是空的。这是因为未验证的xml吗?如何在检索后将其更改为有效的?/thank you Hello感谢您的回答,但我不希望这些属性出现在最终的xml中。.ADSL 4我们可以实现一些东西,现在在元素中显示属性,如您的ADSL 4示例中的属性。谢谢您这是我添加到您的xml中的一个属性est属性处理代码并忘记删除。如果您使用xml在计算机上实际运行此代码,您将看到未添加任何属性。
<p:queryBillingAccountResponse xmlns:p="http://www.ibm.com">
    <ns0:customerAccount xmlns:ns0="http://www.ibm.com/xmlns/">
        <AccountStatus>Paid</AccountStatus>
        <ComponentCustomerAccount>
            <Name>ADSL 4</Name>
            <CharacteristicValue>
                <Characteristic>
                    <Name>Balance</Name>
                </Characteristic>
                <Value>0.0</Value>
            </CharacteristicValue>
            <AccountStatus>Paid</AccountStatus>
        </ComponentCustomerAccount>
    </ns0:customerAccount>
</p:queryBillingAccountResponse>