【问题标题】:DOM get node value by "brother" value in this stringDOM 通过此字符串中的“兄弟”值获取节点值
【发布时间】:2014-03-09 00:05:49
【问题描述】:

我正在创建用于编辑 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>

到(通过从 *-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 中找到“正文”值。

"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”)-> 父母”?

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

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

问候

【问题讨论】:

    标签: php xml object document


    【解决方案1】:

    您需要 XPath 表达式:

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

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

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

    $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";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 2021-10-03
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多