我正在创建用于编辑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”值。
提前感谢您提出建议或链接到类似的,已解决的问题,
问候
答案 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";
}