xml 按名称读取字段

Posted

技术标签:

【中文标题】xml 按名称读取字段【英文标题】:xml read field by name 【发布时间】:2022-01-14 10:16:18 【问题描述】:

您好,我必须读取一个 xml 文件,在部分代码中有一些字段标签,其名称如示例中所述

       <Fields>
        <Field Name="JobId"><![CDATA[7096c681-3165-4137-95a3-4ae873af2132]]></Field>
        <Field Name="isDeleted"><![CDATA[0]]></Field>
        <Field Name="TopicId"><![CDATA[5870811]]></Field>
        <Field Name="Type"><![CDATA[Document]]></Field>
        <Field Name="CustomerId"><![CDATA[8063]]></Field>
        <Field Name="DocumentType"><![CDATA[volopress_pdf]]></Field>
        <Field Name="Inserted"><![CDATA[2021-01-02 08:47:51]]></Field>
        <Field Name="pageNumber"><![CDATA[17]]></Field>
        <Field Name="Position"><![CDATA[1]]></Field>
        <Field Name="TAG_Source"><![CDATA[Cronache di Napoli]]></Field>
        <Field Name="link_pdf"><![CDATA[http://www.pippo.com]]></Field>
        <Field Name="TAG_Topic"><![CDATA[Terremoti]]></Field>
        <Field Name="isValidSnippet"><![CDATA[True]]></Field>
      </Fields>

我只想读取名为“link_pdf”的字段

如果我使用此代码

$alink = $rassegna->Fields->Field[23];

我可以读取该值,但在某些情况下这不是一件好事,我如何通过字段名称访问该值?

$alink = $rassegna->Fields->Field['link_export'];

不工作

【问题讨论】:

您需要遍历字段,直到找到具有您要查找的Name 属性值的字段。或者直接使用XPath根据元素的Name属性内容来查找元素。 【参考方案1】:

使用XPath 选择Field 并将谓词限制到Name 属性值为“link_export”的对象:

$xml = new SimpleXMLElement($string);
$result = $xml->xpath('/Fields/Field[@Name="link_export"]');
while(list( , $node) = each($result)) 
  echo '/Fields/Field[@Name="link_export"]: ',$node,"\n";

【讨论】:

【参考方案2】:

你可以通过一个xpath找到那个项目,不要遵循源xml的所有结构

$xml = simplexml_load_file('02012021.xml');
$result = $xml->xpath('//Field[@Name="link_pdf"]');
foreach($result as $node) 
    echo "$node<br>\n";

【讨论】:

【参考方案3】:

不幸的是,我必须遵循整个结构,因为除了该记录之外,我还必须阅读其他记录

<?php

$xml=simplexml_load_file("02012021.xml") or die("Error: Cannot create object");
$i=0;
foreach($xml->Reports->Report[1]->Hits[0]->children() as $rassegna) 
        echo $rassegna->Order . "<br>";
        echo $rassegna->DocumentReference . "<br>";
        echo $rassegna->Title . "<br>";
        echo $rassegna->Content . "<br>";
        $alink = $xml->xpath('//Field[@Name="link_export"]');
        echo $alink[$i] . "<br>";
        echo "<a href='". $alink[$i] . "'> link </a>";
        echo "<br/><br/>";
        $i=$i+1;

?>

我用刚刚发布的解决方案解决了这个问题

【讨论】:

以上是关于xml 按名称读取字段的主要内容,如果未能解决你的问题,请参考以下文章

用于读取记录数组的 BigQuery Java API:“不支持按名称检索字段值”异常

读取/写入使用 csd 生成的 xml

使用 c# 在属性级别读取带有名称空间的 XML

XDocument 读取具有名称空间的根元素的 XML 文件

C#读取和访问具有相同名称的xml表

过滤数据时错误无法读取未定义的属性名称字段名过滤器?