簡體   English   中英

解析XML文件時如何處理默認名稱空間

[英]How to handle default namespaces when parsing XML files

我的PHP頁面必須解析輸入的XML文件(准確地說是XLIFF),但是當XML文件的根元素中存在默認名稱空間時,該頁面不起作用。

我的代碼假定需要默認名稱空間,並且必須為urn:oasis:names:tc:xliff:document:1.2 如果在XLIFF根元素中找到,則從那里獲取,否則由我的PHP代碼添加。 我以為這是可行的,但似乎不可行,此刻,我唯一可行的唯一方法是從輸入XLIFF文件中刪除默認名稱空間。 當然,無論XLIFF文件中是否存在默認名稱空間,PHP腳本都應該起作用。

在了解必須使用默認名稱空間的情況下,在我的PHP腳本中,我具有:

$xml_file = file_get_contents($pathToInputFile);
if($xml_file === FALSE) {
    die("there is a problem to get contents from XLIFF file");
} 

$xliffObj = new DOMDocument();
$xliffObj->preserveWhiteSpace = true;
$xliffObj->loadXML($xml_file);

$context = $xliffObj->documentElement;
$xpath = new DOMXPath($xliffObj);

if (isSet($context->getAttributeNode('xmlns')->nodeValue)) {
    $ns = $context->getAttributeNode('xmlns')->nodeValue; 
    echo "The ns is: " . $ns;                          // line 198
}
else {
    $ns = "urn:oasis:names:tc:xliff:document:1.2";
    // this works when no default namespaces is defined in the XLIFF file
    echo "I have defined the ns as: " . $ns; 
}

$xpath->registerNamespace('ns', $ns);                 // line 208

$tus = $xpath->query('//trans-unit');
var_dump_pre($tus);die;

如果我的輸入XLIFF文件具有以下內容,則解析工作正常:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xliff PUBLIC "-//XLIFF//DTD XLIFF//EN" "http://www.oasis-open.org/committees/xliff/documents/xliff.dtd">
<xliff xmlns:pisa="http://www.ets.org/pisa" version="1.2">

在這種情況下,輸出為

我已將ns定義為:urn:oasis:names:tc:xliff:document:1.2

object(DOMNodeList)#12(1){[“ length”] => int(2)}

$tus數組在XLIFF文件中包含兩個trans-unit節點。

但是,當文件具有

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xliff PUBLIC "-//XLIFF//DTD XLIFF//EN" "http://www.oasis-open.org/committees/xliff/documents/xliff.dtd">
<xliff xmlns:pisa="http://www.ets.org/pisa" version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">

然后什么都不會提取,並且我保存文件內容的數組為空(具有NULL值)。 輸出為:

ns是:urn:oasis:names:tc:xliff:document:1.2

object(DOMNodeList)#10(1){[“”“] => int(0)}

如您所見, $tus數組為空。

一個可能的解決方案是在再次添加名稱空間聲明之前先刪除它,但是我想了解問題所在。 謝謝。

似乎只有在XML文件中存在命名空間時才有必要將命名空間添加到xpath,因此:

$xpath->registerNamespace('ns', $ns);
$tus = $xpath->query('//ns:trans-unit');

但是,我不確定這在其他情況下是否會適得其反...

當它不存在時,似乎沒有必要將其包括在xpath表達式中:

#$xpath->registerNamespace('ns', $ns);
$tus = $xpath->query('//trans-unit');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM