DOM通过此字符串中的“brother”值获取节点值

时间:2014-03-09 00:05:50

标签: php xml object document

我正在创建用于编辑XML文件到游戏翻译的PHP系统。

我正在使用DOM,例如用于翻译器的文件比较(使用更新XML文件)。

我使用新字符串和/或新ID,有新旧XML(提前:我无法更改XML结构)。

对于将来的回显节点值,通过相同的ID顺序进行比较,我有以下代码:

<?php
   $xml2 = new DOMDocument('1.0', 'utf-16');
   $xml2->formatOutput = true;
   $xml2->preserveWhiteSpace = false;
   $xml2->load(substr($file, 0, -4).'-pl.xml');

   $xml = new DOMDocument('1.0', 'utf-16');
   $xml->formatOutput = true;
   $xml->preserveWhiteSpace = false;
   $xml->load($file);

   for ($i = 0; $i < $xml->getElementsByTagName('string')->length; $i++) {

       if ($xml2->getElementsByTagName('string')->item($i)) {
          $element_pl = $xml2->getElementsByTagName('string')->item($i);
          $body_pl = $element_pl->getElementsByTagName('body')->item(0);
          $id_pl = $element_pl->getElementsByTagName('id')->item(0);
       } else $id_pl->nodeValue = "";

       $element = $xml->getElementsByTagName('string')->item($i);
       $id = $element->getElementsByTagName('id')->item(0);
       $body = $element->getElementsByTagName('body')->item(0);


       if ($id_pl->nodeValue == $id->nodeValue) {
          $element->appendChild( $xml->createElement('body-pl', $body_pl->nodeValue) );
       }

   }

   $xml = simplexml_import_dom($xml);
?>

以上代码更改:

<?xml version="1.0" encoding="utf-16"?>
<strings>
  <string>
    <id>1</id>
    <name>ABC</name>
    <body>English text</body>
  </string>
</strings>

to(通过添加* -pl.xml文件中的文本):

<?xml version="1.0" encoding="utf-16"?>
<strings>
  <string>
    <id>1</id>
    <name>ABC</name>
    <body>English text</body>
    <body-pl>Polish text</body-pl>
  </string>
</strings>

但我需要在* -pl.xml中通过“name”值找到“body”值。

"For" loop:
 get "ABC" from "name" tag [*.xml] ->
 find "ABC" in "name" tag [*-pl.xml] ->
 get body node from that "string" [*-pl.xml]

我可以通过strpos()来做到这一点,但我的(最小的)文件有25346行。

有什么可做的,例如“有孩子(”名字“,”ABC“) - &gt;父母”?

然后我可以得到这个字符串的“body”值。

提前感谢您提出建议或链接到类似的,已解决的问题,

问候

1 个答案:

答案 0 :(得分:1)

您需要XPath表达式:

//name[text()='ABC']/../body

//name[text()='ABC']/following-sibling::body

查看DOMXPath类的PHP手册及其query方法。简而言之,你会像这样使用它:

$xpath = new DOMXPath($dom_document);

// find all `body` nodes that have a `name` sibling
// with an `ABC` value in the entire document
$nodes = $xpath->query("//name[text()='ABC']/../body");

foreach($nodes as $node) {
    echo $node->textContent , "\n\n";
}