我正在从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时,除非完全被页面标签包围,否则我无法获取每个页面节点的文本值。因此,例如,除非查看标题属性(如果存在),否则我无法阅读"关于我们"。这同样适用于"汽车"和"汽车"和"卡车"。
同样,这是从 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
当然,我为此苦苦挣扎,但只要我提出问题,我就会找到答案。无论如何,这种方法有效(最佳答案):
如何使用 php DOM 获取特定的节点文本
不过,我想知道是否有其他方法。