使用 PHP 解析从 InDesign 生成的 XML



我正在从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 获取特定的节点文本

不过,我想知道是否有其他方法。

相关内容

  • 没有找到相关文章