0

如何读取所有属性xml:lang值?有时我不知道在 XML 数据中定义了多少种语言。

<?xml version="1.0" encoding="UTF-8"?>
<offer>
  <products>
    <product>
      <description>
        <name xml:lang="eng">English translation</name>
        <name xml:lang="lat">Latvian translation</name>
      </description>
    </product>
    <product>
      <description>
        <name xml:lang="eng">The same English</name>
        <name xml:lang="pol">And Polish language</name>
      </description>
    </product>
  </products>
</offer>

我可以通过在 xpath 中添加确切的语言代码来在 PHP 中解析 xml:lang

print_r($xml->xpath('products/product/description/name[@xml:lang = "eng"]'));

但我需要将所有 xml:lang 属性值添加到已解析的数组中。

可以用 PHP SimpleXML 完成吗?

4

3 回答 3

1

抱歉,我不是 100% 了解 SimpleXML,但我知道DomDocument 可以满足您的需求。希望这对您有用:

$xmlstring = '<?xml version="1.0" encoding="UTF-8"?>
<offer>
  <products>
    <product>
      <description>
        <name xml:lang="eng">English translation</name>
        <name xml:lang="lat">Latvian translation</name>
      </description>
    </product>
    <product>
      <description>
        <name xml:lang="eng">The same English</name>
        <name xml:lang="pol">And Polish language</name>
      </description>
    </product>
  </products>
</offer>';

$dom = new DOMDocument();
$dom->loadXML($xmlstring); //or $dom->load('filename.xml');

$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//products/product/description/name');

foreach ($nodes as $node) {
    echo 'Language: ' . $node->getAttribute('xml:lang') . '<br />';
    echo 'Value: ' . $node->nodeValue . '<br /><br />';
}

您可以将 $node->getAttribute('xml:lang') 分配给变量并运行一些检查以查看它是否匹配 'eng' 或您需要的任何内容。

我使用了您在原始帖子中使用的 xpath,但您也可以使用 $dom->getElementsByTagName('name') 并以几乎相同的方式访问值和属性。

于 2014-01-10T10:54:15.720 回答
1

那这个呢:

$nodes = $xml->xpath('products/product/description/name[@xml:lang]');

将返回一个<name>-nodes 数组。

如果不是这样,请准确说明您想要的结果。

编辑

试试这个只获取xml:lang属性:

$langs = $xml->xpath("products/product/description/name[@xml:lang]/@xml:lang");
// $lang is an array of simplexml-elements, transform the values to string like this:
$langs = array_map("strval", $langs);
于 2014-01-10T11:37:18.077 回答
1

我找到了访问命名空间属性的更简单方法。你可以使用$name->attributes("xml", true)函数。

这是工作示例:

<?php 
  
$xmlString = '
<products> 
  <product>
    <name xml:lang="eng">
      Apples
    </name>
    <name xml:lang="fr">
      Pommes
    </name>
  </product>
  <product>
    <name xml:lang="eng">
      Strawberries
    </name>
    <name xml:lang="fr">
      Fraises
    </name>
  </product>
</products> 
'; 

$xml = new \SimpleXMLElement($xmlString); 

foreach($xml->product as $product) 
{ 
  foreach ($product->name as $name) 
  {
    $attributes = $name->attributes("xml", true);
    // print_r($attributes);

    foreach ($attributes as $attributeName => $attributeValue)
    {
      // echo $attributeName . PHP_EOL;
      // echo $attributeValue . PHP_EOL;

      if ($attributeValue == "eng" && $attributeName == "lang") {
        echo "English: " . trim(((string) $name)) . PHP_EOL;
      }
      if ($attributeValue == "fr" && $attributeName == "lang") {
        echo "French: " . trim(((string) $name)) . PHP_EOL;
      }
    }
  }
} 

在线演示:https ://repl.it/repls/LovingFineDaemon

于 2020-06-25T12:35:05.423 回答