1

有効なXML値ではないフィールドcontaingでの文字列解析についてのヘルプが本当に必要です。文字列フィールドに入力するターゲット値とともに現在の値を表示します。

この値を持つフィールド$xmlStringがあります(要素はSEPERATE行ではなく、SAME行にあります。これはWebサービスの応答であるため、後の解析でのみ応答に影響を与えません):

<?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/2009">
                <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>

これが可能であれば、この出力が必要です。

<queryBillingAccountResponse>
    <customerAccount>
        <ComponentCustomerAccount>
            <Name>ADSL 4</Name>
            <CharacteristicValue>
                <Characteristic>
                    <Name>Balance</Name>
                </Characteristic>
                    <Value>0.0</Value>
                </CharacteristicValue>
            <CharacteristicValue>
            <AccountStatus>Paid</AccountStatus>
        </ComponentCustomerAccount>
    </customerAccount>
</queryBillingAccountResponse>

したがって、最初の3行(実際には個別の行ではありませんが)と最後の2行がなく、とに名前空間が定義されていないことに気付くでしょqueryBilling AccountResponsecustomer Account。名前空間のないこれらの要素を文字列フィールドに入れたいです。開始タグと終了タグの両方。私は本当にこの出力が必要です。これを解析する方法は?SimpleXMLElementを試してみましたが、解析できませんでした。ご協力ありがとうございました

$ xml = simplexml_load_string($ text);で解析できない更新された出力

<<<XML
<?xml version="1.0" encoding="utf-8"?>
<Envelope>
<Body>
<queryBillingAccountResponse>
<customerAccount>
<ComponentCustomerAccount>
<Name>ADSL 4</Name>
<CharacteristicValue>
<Characteristic>
<Name>Balance</Name>
</Characteristic>
<Value>0.0</Value>
</CharacteristicValue>
<AccountStatus>Paid</AccountStatus>
</ComponentCustomerAccount>
</customerAccount>
</queryBillingAccountResponse>
</Body>
</Envelope>
XML>
4

1 に答える 1

2

SimpleXMLが理解できるxmlコードを作成するために、また名前空間宣言は必要ないため、次のコードは、コードを適用する前にコードをクリーンアップします。simplexml_load_string

<?php
    // if the XML comes from a file (or just assign the $text string)
    $text = file_get_contents('myfile.xml');
    $text = preg_replace('/(<\s*)\w+:/','$1',$text);   // removes <xxx:
    $text = preg_replace('/(<\/\s*)\w+:/','$1',$text); // removes </xxx:
    $text = preg_replace('/\s+xmlns:[^>]+/','',$text); // removes xmlns:...

    // the code should be clean enough for SimpleXML to parse it
    $xml = simplexml_load_string($text);

    // view the XML (and process it afterwards...)
    print_r($xml);

サンプルXMLを(ファイルではなく)文字列に入れるには

    <?php
       $text = <<<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/2009">
                <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;

    $text = preg_replace('/(<\s*)\w+:/','$1',$text);   // removes <xxx:
    $text = preg_replace('/(<\/\s*)\w+:/','$1',$text); // removes </xxx:
    $text = preg_replace('/\s+xmlns:[^>]+/','',$text); // removes xmlns:...

    // the code should be clean enough for SimpleXML to parse it
    $xml = simplexml_load_string($text);

    // view the XML (and process it afterwards...)
    print_r($xml);

要素にアクセスするには、->(および[xx]配列に)を使用します。例:

    echo echo $xml->Body->queryBillingAccountResponse->customerAccount->ComponentCustomerAccount->Name . "\n";

が表示されます

ADSL 4

SimpleXMLドキュメント

于 2013-03-23T13:02:36.707 に答える