从多个 XML 行中提取数据
Extract Data off multiple XML row
我有一个非常奇怪的 XML 响应,我需要提取它的数据。我需要获取 "value" 属性中的数据,但我需要根据它们的 "key" 属性来选择它们。
这是它的样子
<phone>
2125556666
</phone>
<State>
ny
</State>
<Response>
<data key="Supported" value="Yes"/>
<data key="Host" value="Remote"/>
<data key="WholeProductList">
<data key="Product" value="a-z44"/>
<data key="Product" value="c-k99"/>
<data key="Product" value="e-b089"/>
<data key="Product" value="z-p00"/>
<data key="Product" value="r-333"/>
<data key="Product" value="t-RS232"/>
<data key="Product" value="4-lve"/>
<data key="Product" value="Shutdown"/>
</data>
</Response>
在PHP我目前有
$xmltmp = new DomDocument;
$xmltmp->loadXml($response);
$phone = $xmlresponse->getElementsByTagName('phone')->item(0)->nodeValue;
$state = $xmlresponse->getElementsByTagName('state')->item(0)->nodeValue;
echo $phone;
echo $state;
这当前输出 phone 数字和状态。它工作正常。
现在我需要知道 "Supported" 键的值是 Yes 还是 No,如果是,我需要获取所有 "Products"。我有点卡住了,因为我很难制作 foreach 语句,然后检查 "key" 属性值。
谢谢!
这不太行得通 "as is" 因为我不知道 XML 文档的实际结构是什么,但简而言之,您将 XML 节点映射到 XPath像 //root/node/child_node/@attribute
等等。
它也应该有一些健全的(非空)类型签入。
$xmltmp = new DomDocument;
$xmltmp->loadXml($response);
$xQuery = new DOMXPath($xmltmp);
//not sure what your root node is so the query path is probably wrong
$supported = $xQuery->query('/Response/data[@key="Supported"]/@value')->value;
您还可以替换:
$phone = $xmlresponse->getElementsByTagName('phone')->item(0)->nodeValue;
$state = $xmlresponse->getElementsByTagName('state')->item(0)->nodeValue;
对于类似的东西(再次 - 没有 XML 文档的完整结构,路径本身可能不太正确):
$phone = $xQuery->query('/phone')->item(0)->nodeValue;
$state = $xQuery->query('/State')->item(0)->nodeValue;
您的XML无效。 XML 文档总是需要一个文档元素节点。
示例:
<root>
<phone>2125556666</phone>
<State>ny</State>
<Response>
<data key="Supported" value="Yes"/>
...
</data>
</Response>
</root>
从 DOM 获取数据的最简单方法是 XPath。在 PHP 中由 DOMXPath
提供 class 和 ext/dom
的一部分。 DOMXPath::evaluate()
允许您从 DOM 文档中获取节点列表或标量值。
$dom = new DOMDocument;
$dom->loadXml($xml);
$xpath = new DOMXPath($dom);
$phone = $xpath->evaluate('string(/*/phone)');
$state = $xpath->evaluate('string(/*/State)');
var_dump($phone, $state);
输出:
string(10) "2125556666"
string(2) "ny"
像 /*/phone
这样的表达式选择文档元素内的所有 phone
元素子节点。 string(/*/phone)
将第一个找到的节点转换为一个字符串,然后 return。如果没有找到节点,它将 return 一个空字符串。
受支持状态的 XPath 表达式稍微复杂一些。 []
中提供了节点的条件。可以直接在 XPath 中比较结果。 return 值将是一个布尔值。
$supported = $xpath->evaluate('/*/Response/data[@key="Supported"]/@value = "Yes"');
var_dump($supported);
输出:
bool(true)
如果表达式 return 是一个节点列表,您可以使用 foreach()
对其进行迭代。
$nodes = $xpath->evaluate(
'/*/Response/data[@key="WholeProductList"]/data[@key="Product"]/@value'
);
$products = [];
foreach ($nodes as $attributeNode) {
$products[] = $attributeNode->value;
}
var_dump($products);
输出:
array(8) {
[0]=>
string(5) "a-z44"
[1]=>
string(5) "c-k99"
[2]=>
string(6) "e-b089"
[3]=>
string(5) "z-p00"
[4]=>
string(5) "r-333"
[5]=>
string(7) "t-RS232"
[6]=>
string(5) "4-lve"
[7]=>
string(8) "Shutdown"
}
我有一个非常奇怪的 XML 响应,我需要提取它的数据。我需要获取 "value" 属性中的数据,但我需要根据它们的 "key" 属性来选择它们。
这是它的样子
<phone>
2125556666
</phone>
<State>
ny
</State>
<Response>
<data key="Supported" value="Yes"/>
<data key="Host" value="Remote"/>
<data key="WholeProductList">
<data key="Product" value="a-z44"/>
<data key="Product" value="c-k99"/>
<data key="Product" value="e-b089"/>
<data key="Product" value="z-p00"/>
<data key="Product" value="r-333"/>
<data key="Product" value="t-RS232"/>
<data key="Product" value="4-lve"/>
<data key="Product" value="Shutdown"/>
</data>
</Response>
在PHP我目前有
$xmltmp = new DomDocument;
$xmltmp->loadXml($response);
$phone = $xmlresponse->getElementsByTagName('phone')->item(0)->nodeValue;
$state = $xmlresponse->getElementsByTagName('state')->item(0)->nodeValue;
echo $phone;
echo $state;
这当前输出 phone 数字和状态。它工作正常。
现在我需要知道 "Supported" 键的值是 Yes 还是 No,如果是,我需要获取所有 "Products"。我有点卡住了,因为我很难制作 foreach 语句,然后检查 "key" 属性值。
谢谢!
这不太行得通 "as is" 因为我不知道 XML 文档的实际结构是什么,但简而言之,您将 XML 节点映射到 XPath像 //root/node/child_node/@attribute
等等。
它也应该有一些健全的(非空)类型签入。
$xmltmp = new DomDocument;
$xmltmp->loadXml($response);
$xQuery = new DOMXPath($xmltmp);
//not sure what your root node is so the query path is probably wrong
$supported = $xQuery->query('/Response/data[@key="Supported"]/@value')->value;
您还可以替换:
$phone = $xmlresponse->getElementsByTagName('phone')->item(0)->nodeValue;
$state = $xmlresponse->getElementsByTagName('state')->item(0)->nodeValue;
对于类似的东西(再次 - 没有 XML 文档的完整结构,路径本身可能不太正确):
$phone = $xQuery->query('/phone')->item(0)->nodeValue;
$state = $xQuery->query('/State')->item(0)->nodeValue;
您的XML无效。 XML 文档总是需要一个文档元素节点。
示例:
<root>
<phone>2125556666</phone>
<State>ny</State>
<Response>
<data key="Supported" value="Yes"/>
...
</data>
</Response>
</root>
从 DOM 获取数据的最简单方法是 XPath。在 PHP 中由 DOMXPath
提供 class 和 ext/dom
的一部分。 DOMXPath::evaluate()
允许您从 DOM 文档中获取节点列表或标量值。
$dom = new DOMDocument;
$dom->loadXml($xml);
$xpath = new DOMXPath($dom);
$phone = $xpath->evaluate('string(/*/phone)');
$state = $xpath->evaluate('string(/*/State)');
var_dump($phone, $state);
输出:
string(10) "2125556666"
string(2) "ny"
像 /*/phone
这样的表达式选择文档元素内的所有 phone
元素子节点。 string(/*/phone)
将第一个找到的节点转换为一个字符串,然后 return。如果没有找到节点,它将 return 一个空字符串。
受支持状态的 XPath 表达式稍微复杂一些。 []
中提供了节点的条件。可以直接在 XPath 中比较结果。 return 值将是一个布尔值。
$supported = $xpath->evaluate('/*/Response/data[@key="Supported"]/@value = "Yes"');
var_dump($supported);
输出:
bool(true)
如果表达式 return 是一个节点列表,您可以使用 foreach()
对其进行迭代。
$nodes = $xpath->evaluate(
'/*/Response/data[@key="WholeProductList"]/data[@key="Product"]/@value'
);
$products = [];
foreach ($nodes as $attributeNode) {
$products[] = $attributeNode->value;
}
var_dump($products);
输出:
array(8) {
[0]=>
string(5) "a-z44"
[1]=>
string(5) "c-k99"
[2]=>
string(6) "e-b089"
[3]=>
string(5) "z-p00"
[4]=>
string(5) "r-333"
[5]=>
string(7) "t-RS232"
[6]=>
string(5) "4-lve"
[7]=>
string(8) "Shutdown"
}