[英]Parse generated XML from InDesign with PHP
我正在從InDesign中生成XML,並且想在PHP中解析XML。 以下是InDesign生成的XML的示例:
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<page title="About Us">
About Us
<page>Overiew</page>
<page>Where We Started</page>
<page>Help</page>
</page>
<page>
Automobiles
<page>
Cars
<page>Small</page>
<page>Medium</page>
<page>Large</page>
</page>
<page>
Trucks
<page>Flatbet</page>
<page>
Pickup
<page>Dodge</page>
<page>Nissan</page>
</page>
</page>
</page>
</Root>
我正在使用以下PHP代碼來遞歸解析XML。
header('Content-type: text/plain');
function parse_recursive(SimpleXMLElement $element, $level = 0)
{
$indent = str_repeat("\t", $level); // determine how much we'll indent
$value = trim((string) $element); // get the value and trim any whitespace from the start and end
$attributes = $element->attributes(); // get all attributes
$children = $element->children(); // get all children
echo "{$indent}Parsing '{$element->getName()}'...".PHP_EOL;
if(count($children) == 0 && !empty($value)) // only show value if there is any and if there aren't any children
{
echo "{$indent}Value: {$element}".PHP_EOL;
}
// only show attributes if there are any
if(count($attributes) > 0)
{
echo $indent.'Has '.count($attributes).' attribute(s):'.PHP_EOL;
foreach($attributes as $attribute)
{
echo "{$indent}- {$attribute->getName()}: {$attribute}".PHP_EOL;
}
}
// only show children if there are any
if(count($children))
{
echo $indent.'Has '.count($children).' child(ren):'.PHP_EOL;
foreach($children as $child)
{
parse_recursive($child, $level+1); // recursion :)
}
}
echo $indent.PHP_EOL; // just to make it "cleaner"
}
$xml = new SimpleXMLElement('data.xml', null, true);
parse_recursive($xml);
我遇到的問題是,當我解析XML時,除非完全被頁面標簽包圍,否則我不會獲得每個頁面節點的文本值。 因此,例如,除非查看title屬性(如果存在),否則我無法閱讀“關於我們”。 “汽車”,“汽車”和“卡車”也是如此。
同樣,這是從InDesign生成的XML。 我可以要求設計人員將屬性添加到節點等,但是我正在嘗試最小化數據輸入量。
我相信XML格式正確。 任何幫助將不勝感激。
如果節點具有任何子代,則忽略所有文本值以更改替換:
if(count($children) == 0 && !empty($value)) // only show value if there is any and if there aren't any children
{
echo "{$indent}Value: {$element}".PHP_EOL;
}
同
if(!empty($value)) // only show value if there is anychildren
{
echo "{$indent}Value: {$value}".PHP_EOL;
}
樣本數據的結果是:
Parsing 'Root'...
Has 2 child(ren):
Parsing 'page'...
Value: About Us
Has 1 attribute(s):
- title: About Us
Has 3 child(ren):
Parsing 'page'...
Value: Overiew
Parsing 'page'...
Value: Where We Started
Parsing 'page'...
Value: Help
Parsing 'page'...
Value: Automobiles
Has 2 child(ren):
Parsing 'page'...
Value: Cars
Has 3 child(ren):
Parsing 'page'...
Value: Small
Parsing 'page'...
Value: Medium
Parsing 'page'...
Value: Large
Parsing 'page'...
Value: Trucks
Has 2 child(ren):
Parsing 'page'...
Value: Flatbet
Parsing 'page'...
Value: Pickup
Has 2 child(ren):
Parsing 'page'...
Value: Dodge
Parsing 'page'...
Value: Nissan
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.