【发布时间】:2021-03-27 09:24:00
【问题描述】:
正如标题所述,我有一个如下所示的 XML,其中一个帐户展开以查看内容。
<?xml version="1.0" encoding="utf-8"?>
<eExact
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="eExact-XML.xsd">
<Accounts>
<Account code="0" searchcode="" status="A" > </Account>
<Account code="1" searchcode="" status="A" > </Account>
<Account code="3" searchcode="" status="C" > </Account>
<Account code="4" searchcode="" status="C" > </Account>
<Account code="2" searchcode="" status="C" >
<Name>Company 1</Name>
<Phone>684564</Phone>
<Email>info@company1.com</Email>
<Contact number="2090075" gender="M" default="1" ID="{2449ce5d-41b3-4f80-bab3-d13f6687dfe4}">
<LastName>Doe</LastName>
<FirstName>Tom</FirstName>
<Phone>44546456456e</Phone>
<Email>tom.doe@company1.com</Email>
</Contact>
<Address type="SIV" default="1" ID="{41bde841-afde-4f5d-9cd0-a12ecf6f6777}">
<AddressLine1>adress</AddressLine1>
<PostalCode>10000</PostalCode>
<City>TheCity</City>
<Contact number="2090075" ID="{2449ce5d-41b3-4f80-bab3-d13f6687dfe4}" />
</Address>
<VATNumber>a_VAT_number_XXXX</VATNumber>
<VATLiability>L</VATLiability>
<SalesCurrency code="EUR" />
<PurchaseCurrency code="EUR" />
</Account>
</Accounts>
<Topics>
<Topic code="Accounts" ts_d="0x000000006517487D" count="5" pagesize="1000" />
</Topics>
<Messages />
</eExact>
我要做的是返回状态为 C 并在 VATNumber 标记中包含值的帐户。有些帐户不包含 VATNumber 中的值,所以我希望那些被过滤掉或不返回。
到目前为止,我设法退回了 C 帐户,但没有过滤增值税号。
$document = new DOMDocument();
$document->loadXML($response);
$xpath = new DOMxpath($document);
foreach ($xpath->evaluate('(/eExact/Accounts/Account[@status="C"])') as $account) {
$json[] = [
'email' => $xpath->evaluate('string(Contact[@default="1"]/Email)', $account),
//'username' => $xpath->evaluate('string(Contact[@default="1"]/FirstName)', $account),
'first_name' => $xpath->evaluate('string(Contact[@default="1"]/FirstName)', $account),
'last_name' => $xpath->evaluate('string(Contact[@default="1"]/LastName)', $account),
'billing' => [
'first_name' => $xpath->evaluate('string(Contact[@default="1"]/FirstName)', $account),
'last_name' => $xpath->evaluate('string(Contact[@default="1"]/LastName)', $account),
'postcode'=> $xpath->evaluate('string(Address[@default="1"]/PostalCode)', $account),
'VATNumber' => $xpath->evaluate('string(VATNumber)', $account),
],
];
// ...
}
$customer = json_encode($json, JSON_PRETTY_PRINT);
$customers = "{\"create\": {$customer} \t}";
// echo $customer;
echo $customers;
它给了我这个输出:
Key OK{"create": [
{
"email": "john.doe@company2.com",
"first_name": "John",
"last_name": "Doe",
"billing": {
"first_name": "John",
"last_name": "Doe",
"postcode": "",
"VATNumber": ""
}
},
{
"email": "steve.known@company3.com",
"first_name": "Steve",
"last_name": "Known",
"billing": {
"first_name": "Steve",
"last_name": "Known",
"postcode": "",
"VATNumber": ""
}
},
{
"email": "tom.doe@company1.com",
"first_name": "Tom",
"last_name": "Doe",
"billing": {
"first_name": "Tom",
"last_name": "Doe",
"postcode": "9200",
"VATNumber": "a_VAT_number_XXXX"
}
}
我该如何做到这一点,以使 John 和 Steve 不会因为他们的增值税号为空而出现?
我假设在创建数组之前我需要先过滤。
【问题讨论】: