【问题标题】:Exporting defined elements from XML从 XML 导出定义的元素
【发布时间】:2011-12-16 21:34:44
【问题描述】:

我想导出(或保留)XML 中具有已定义属性的子标签。由于我不知道这个过程的名称,我在网上找不到任何有关它的信息。由于很难解释,我决定为我的问题举一个例子。

假设我有这个 XML 文件:

<results>
    <result idSite="1">
        <row>
            <label>category</label>
            <visits>2</visits>
            <idsubdatatable>5</idsubdatatable>
            <subtable>
                <row>
                    <label>uncategorized</label>
                    <visits>2</visits>
                    <idsubdatatable>6</idsubdatatable>
                    <subtable>
                        <row>
                            <label>/index</label>
                            <visits>2</visits>
                            <url>http://mysite1.com/category/uncategorized/</url>
                        </row>
                    </subtable>
                </row>
            </subtable>
        </row>
        <row>
            <label>about</label>
            <visits>1</visits>
            <idsubdatatable>7</idsubdatatable>
            <subtable>
                <row>
                    <label>/index</label>
                    <visits>1</visits>
                    <url>http://mysite1.com/about/</url>
                </row>
            </subtable>
        </row>
    </result>
    <result idSite="2">
        <row>
            <label>/calendar</label>
            <visitors>1</visitors>
            <url>http://mysite2.com/calendar</url>
        </row>
    </result>
</results>

我必须解析结果并只保留具有&lt;url&gt; 属性的行。像这样:

解析后我必须将这些行合并到一个新的 XML 文件中,最终结果必须是这样的:

<result>
<row>
    <label>/index</label>
    <visits>2</visits>
    <url>http://mysite1.com/category/uncategorized/</url>
</row>
<row>
    <label>/index</label>
    <visits>1</visits>
    <url>http://mysite1.com/about/</url>
</row>
<row>
    <label>/calendar</label>
    <visitors>1</visitors>
    <url>http://mysite2.com/calendar</url>
</row>
</result>

一般来说,我想用 PHP 来做这个过程,但也可能用其他语言来做。 因此,如果您有任何解决此问题的想法,请发表评论。

【问题讨论】:

  • 那些不是属性,而是元素(或者通常是标签)。 XML 中的 属性 是另一回事。可能这对您的搜索有帮助。

标签: php xml parsing


【解决方案1】:

我会使用 xpath 查询来查找行节点内的所有 url 节点。然后,只需将找到的每个 url 元素的父节点附加到新的 DomDocument 中,如下所示:

$xml = '...';
$dom = new DomDocument();
$dom->preserveWhiteSpace = FALSE;
$dom->loadXML($xml);

$new_dom = new DomDocument();
$result = $new_dom->createElement('result');
$new_dom->appendChild($result);

$xpath = new DOMXPath($dom);
$rows = $xpath->query('//row/url');

for ($i=0;$i<$rows->length;$i++) {
  $node = $new_dom->importNode($rows->item($i)->parentNode, TRUE);
  $result->appendChild($node);
}

$new_dom->formatOutput = TRUE;
echo $new_dom->saveXML();

【讨论】:

    【解决方案2】:

    我会使用 simplexml 来读取您的输入,因此您的解析会很容易。然后,我会创建一个递归函数,例如:

    function isUrlElement($element){
        foreach($element->children() as $children){
            if($children->getName() == 'url'){
                return true;
            }else{
                isUrlElement($children);
            }
        }
    }
    

    现在这还远未完成,但您可以递归地为每个孩子调用它。当这返回 true 时,您会知道您找到了一个以 URL 作为子节点的节点。例如,使用该 $element 节点将其添加到 simplexmlelements 数组中,然后将其 foreach 回 XML。

    这有意义吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      • 2015-08-19
      • 1970-01-01
      • 2013-12-16
      • 2017-10-02
      • 2021-03-30
      相关资源
      最近更新 更多