簡體   English   中英

使用PHP解析InDesign中生成的XML

[英]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

當然,我為此感到掙扎,但是當我提出問題時,我便找到了答案。 無論如何,這種方法有效(最佳答案):

如何使用php DOM獲取特定的節點文本

我想知道是否還有其他方法。

暫無
暫無

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

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