天道酬勤,学无止境

Get children attributes using simplexml

The xml data looks like this:

<feed>    
    <entry>
        <abc:rank scheme="http://foo.bar">45</abc:rank>
        <abc:rank scheme="http://foo2.bar">88</abc:rank>
    </entry>
    <entry>
        <abc:rank scheme="http://foo.bar">125</abc:rank>
        <abc:rank scheme="http://foo2.bar">32</abc:rank>
    </entry>
</feed>

I am able to output all of these entries with this code:

foreach($xml->entry[$i]->children('abc', true) as $a) {
    echo $a;
}

However, if I want to get the one with the content "88" in the first entry, something like

foreach($xml->entry[$i]->children('abc', true) as $a) {
    if($a["scheme"] == "http://foo2.bar")
        echo $a;
}

does not work.

How can I select these children depending on their attribute?

标签

评论

Ok I got it by now. For those interested in the correct solution:

    $namespaces = $xml->entry[$i]->getNameSpaces('true');
    $abc= $xml->entry[$i]->children($namespaces['abc']);
    foreach($abc->rank as $a) {
        $scheme = $a->attributes();
        echo $scheme['scheme'];
        echo " - ";
    }

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 使用 SimpleXML 获取 XML 属性(Get XML Attribute with SimpleXML)
    问题 我正在尝试获取$xml->entry->yt:statistics->attributes()->viewCount属性,并且我已经使用 SimpleXML 尝试了一些东西,但我真的无法让它工作! 尝试 #1 <?php $xml = simplexml_load_file("http://gdata.youtube.com/feeds/api/videos?author=Google"); echo $xml->entry[0]->yt:statistics['viewCount']; ?> 尝试#2 <?php $xml = simplexml_load_file("http://gdata.youtube.com/feeds/api/videos?author=Google"); echo $xml->entry[0]->yt:statistics->attributes()->viewCount; ?> 两者都返回空白,虽然 SimpleXML 正在工作,但我尝试获取提要的标题,这奏效了! 有任何想法吗? 我在 SO 和其他网站上查看了大量其他示例,但不知何故这不起作用? PHP 是否将 ':' 识别为截止,或者我只是在做一些愚蠢的事情? 谢谢,任何回复都非常感谢! 回答1 如果您只想获取 youtube 视频的观看次数,则必须指定视频 ID。 youtube ID
  • 使用SimpleXML读取RSS提要(Using SimpleXML to read RSS feed)
    问题 我正在使用PHP和simpleXML来阅读以下rss feed: http://feeds.bbci.co.uk/news/england/rss.xml 我可以这样获得大多数信息: $rss = simplexml_load_file('http://feeds.bbci.co.uk/news/england/rss.xml'); echo '<h1>'. $rss->channel->title . '</h1>'; foreach ($rss->channel->item as $item) { echo '<h2><a href="'. $item->link .'">' . $item->title . "</a></h2>"; echo "<p>" . $item->pubDate . "</p>"; echo "<p>" . $item->description . "</p>"; } 但是我将如何输出以下标记中的缩略图: <media:thumbnail width="66" height="49" url="http://news.bbcimg.co.uk/media/images/51078000/jpg/_51078953_226alanpotbury.jpg"/> 回答1 SimpleXML在处理名称空间方面非常糟糕。 您有两种选择
  • 如何用 PHP 解析 XML 的媒体:内容?(How to Parse XML's Media:Content with PHP?)
    问题 我在以下位置找到了一个关于如何完成大部分工作的很棒的教程: https://www.developphp.com/video/PHP/simpleXML-Tutorial-Learn-to-Parse-XML-Files-and-RSS-Feeds 但我不明白如何从提要中提取媒体:内容图像。 我已经阅读了尽可能多的信息,但我仍然被困住了。 即:How to get media:content with SimpleXML 这建议使用: foreach ($xml->channel->item as $news){ $ns_media = $news->children('http://search.yahoo.com/mrss/'); echo $ns_media->content; // displays "<media:content>"} 但我无法让它工作。 这是我正在尝试解析的脚本和提要: <?php $html = ""; $url = "http://rssfeeds.webmd.com/rss/rss.aspx?RSSSource=RSS_PUBLIC"; $xml = simplexml_load_file($url); for($i = 0; $i < 10; $i++){ $title = $xml->channel->item[$i]->title;
  • 如何访问这个子元素 - php simplexml 中的属性(how to access this child element - attribute in php simplexml)
    问题 我想访问下面 media:content 元素中的“url”属性。 我很确定这给了我媒体:内容,但我似乎无法获得网址(请参阅我在下面尝试的内容): $theContent = $item->children('media', true)->content; xml : <item> <media:content type="image/jpeg" url="my url" /> </item> 我尝试过变体: $theURL = $item->children('media', true)->content['url']; 和 $mediaItem=$item->children('media', true)->content; $contentItem=$mediaItem->children('content', true); $url = $contentItem['url']; 没运气。 ?? 回答1 带有输出的完整工作代码: <?php $xml = '<item> <media:content type="image/jpeg" url="my url" /> </item>'; $theContent = @new SimpleXMLElement($xml); $attributes = $theContent->content->attributes()
  • 如何使用SimpleXML解析XML的CDATA HTML内容?(How to parse CDATA HTML-content of XML using SimpleXML?)
    问题 我正在尝试在表格中显示Xml内容,所有内容都可以正常运行,但是标签中的某些内容我不想显示,我只希望图像而不想要 2012年11月日历(来自5.10测试) like in xml, <content:encoded><![CDATA[<p>November 2012 calendar from 5.10 The Test</p> <p><a class="shutterset_" href='http://trance-gemini.com/wordpress/wp-content/gallery/calendars/laura-bertram-trance-gemini-145-1080.jpg' title='<br>November 2012 calendar from 5.10 The Test<br> <a href="</a></p>]]> </content:encoded> 我想显示图像但不显示 2012年11月日历(来自5.10测试) . <?php // load SimpleXML $item = new SimpleXMLElement('test1.xml', null, true); echo <<<EOF <table border="1px"> <tr cl> </tr> EOF; foreach($item->channel->item as
  • SimpleXML 返回多个对象,如何获取数据?(SimpleXML returning multiple objects, how can I get the data?)
    问题 我正在使用 simpleXML 来解析这个 xml 文件。 这是我用来访问 YouTube API 的提要。 我想在一个对象中嵌入最新的视频并显示接下来的四个缩略图。 因此,我在此使用simplexml_load_file ,使用foreach循环访问每个提要中的值。 我可以毫无问题地访问这些值,但我遇到了将每个视频存储在单独的SimpleXMLElement Object 。 我无法控制我正在访问的对象,因为它们没有存储在数组中。 所以我不能得到,比如说, $thumb[4]或$entry[4]->thumb 。 我尝试使用SimpleXMLIterator ,但无论出于何种原因,具有相同开头的任何值都呈现为空白。 例如,视频可能有十一种变体: 这些都将呈现为[1]="" 、 [2]="" 、 [3]=""等。 我很乐意为任何可以提供帮助的人提供更多信息! 编辑 这是我的结果的 print_r。 这是在单个变量上完成的,目的是让您了解我面临的结构问题。 整个 print_r($entry) 将为 XML 文件中的每个节点提供变量。 SimpleXMLElement Object ( [0] => 159 ) SimpleXMLElement Object ( [0] => 44 ) 此外,print_r 只是在 PHP 块内进行测试。 我实际上是想访问 HTML
  • PHP将XML转换为JSON(PHP convert XML to JSON)
    问题 我正在尝试将xml中的xml转换为json。 如果我使用简单的xml和json_encode进行简单的转换,则xml中的任何属性都不会显示。 $xml = simplexml_load_file("states.xml"); echo json_encode($xml); 所以我试图像这样手动解析它。 foreach($xml->children() as $state) { $states[]= array('state' => $state->name); } echo json_encode($states); 并且状态的输出为{"state":{"0":"Alabama"}}而不是{"state":"Alabama"} 我究竟做错了什么? XML: <?xml version="1.0" ?> <states> <state id="AL"> <name>Alabama</name> </state> <state id="AK"> <name>Alaska</name> </state> </states> 输出: [{"state":{"0":"Alabama"}},{"state":{"0":"Alaska"} var dump: object(SimpleXMLElement)#1 (1) { ["state"]=> array(2) { [0]=>
  • simplexml_load_file - 具有空值的冗余元素被转换为新的 SimpleXMLElement 对象(simplexml_load_file - redundant element with empty value is converted to new SimpleXMLElement Object)
    问题 我使用 simplexml_load_file 将 XML 文件转换为对象。 当冗余元素具有空值时,我注意到了一个问题。 我认为这个例子使它更容易理解: // XML-File (Just a small excerpt look at "...") ... <Team uID="t684"> ... <Player loan="" uID="p20388"> <Name>Manuel Neuer</Name> <Position>Goalkeeper</Position> <Stat Type="first_name">Manuel</Stat> <Stat Type="last_name">Neuer</Stat> <Stat Type="middle_name"></Stat> <Stat Type="known_name"></Stat> <Stat Type="birth_date">1986-03-27</Stat> <Stat Type="birth_place"></Stat> <Stat Type="first_nationality"></Stat> <Stat Type="deceased"></Stat> <Stat Type="preferred_foot"></Stat> <Stat Type="weight">92</Stat> <Stat
  • SimpleXML:选择具有特定属性值的元素(SimpleXML: Selecting Elements Which Have A Certain Attribute Value)
    问题 在XML文档中,我具有共享相同名称的元素,但是属性的值定义了它是什么类型的数据,并且我想从文档中选择所有具有特定值的元素。 我是否需要使用XPath(如果可以,建议使用正确的语法)还是有一个更优雅的解决方案? 这是一些示例XML: <object> <data type="me">myname</data> <data type="you">yourname</data> <data type="me">myothername</data> </object> 我想选择类型为me的<object>的所有<data>标记子代的内容。 PS-我正在尝试使用PHP与Netflix API进行接口-这对我的问题无关紧要,但是如果您想提出一种更好/更好的方法,我非常高兴。 回答1 试试这个XPath: /object/data[@type="me"] 内容为: 选择当前元素的( / )子object称为object 选择( / )他们的孩子称为data 筛选( [...] )列表到其中...的元素属性type ( @表示“属性”) 具有文本值me 所以: $myDataObjects = $simplexml->xpath('/object/data[@type="me"]'); 如果object不是文档的根目录,则可能要使用//object/data[@type="me"] 。 /
  • PHP SimpleXML递归函数列出子项和属性(PHP SimpleXML recursive function to list children and attributes)
    问题 我需要一些关于 SimpleXML 调用的帮助,以获取列出元素名称和属性的递归函数。 制作一个 XML 配置文件系统,但每个脚本都有自己的配置文件以及新的命名约定。 所以我需要的是一种简单的方法来映射所有具有属性的元素,所以就像在示例 1 中一样,我需要一种调用所有进程的简单方法,但我不知道如何在不硬编码元素名称的情况下执行此操作函数调用。 有没有办法递归调用函数来匹配子元素名称? 我确实看到了 xpath 功能,但我不知道如何将其用于属性。 示例中的 XML 是否也正确? 我可以这样构造我的 XML 吗? 示例 1: <application> <processes> <process id="123" name="run batch A" /> <process id="122" name="run batch B" /> <process id="129" name="run batch C" /> </processes> <connections> <databases> <database usr="test" pss="test" hst="test" dbn="test" /> </databases> <shells> <ssh usr="test" pss="test" hst="test-2" /> <ssh usr="test" pss="test"
  • how to access this child element - attribute in php simplexml
    I want to access the 'url' attribute in the media:content element below. I am pretty sure this gives me the media:content, but I can not seem to get the url (see what I tried below): $theContent = $item->children('media', true)->content; xml: <item> <media:content type="image/jpeg" url="my url" /> </item> I have tried variations: $theURL = $item->children('media', true)->content['url']; and $mediaItem=$item->children('media', true)->content; $contentItem=$mediaItem->children('content', true); $url = $contentItem['url']; No luck. ??
  • PHP SimpleXML recursive function to list children and attributes
    I need some help on the SimpleXML calls for a recursive function that lists the elements name and attributes. Making a XML config file system but each script will have it's own config file as well as a new naming convention. So what I need is an easy way to map out all the elements that have attributes, so like in example 1 I need a simple way to call all the processes but I don't know how to do this without hard coding the elements name is the function call. Is there a way to recursively call a function to match a child element name? I did see the xpath functionality but I don't see how to
  • SimpleXML和print_r()-为什么这是空的?(SimpleXML and print_r() - why is this empty?)
    问题 嗨,这是我的xml文件:(thefile) <?xml version="1.0" encoding="utf-8"?> <ArrayOfItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://nts-de-osm1-pxc/webservices/"> <Item xmlns:q1="http://systinet.com/wsdl/com/osm/webservices/service/" xsi:type="q1:Document"> <q1:attributes> <q1:Attribute> <q1:dataDictionary xsi:nil="true" /> <q1:dataType>string</q1:dataType> <q1:displayName>AEND_DATUM</q1:displayName> <q1:key>false</q1:key> <q1:name>AEND_DATUM</q1:name> <q1:searchable>true</q1:searchable> <q1:userAttribute>true</q1:userAttribute> <q1
  • PHP的DOM和SimpleXML扩展之间有什么区别?(What's the difference between PHP's DOM and SimpleXML extensions?)
    问题 我无法理解为什么我们在PHP中需要2个XML解析器。 有人可以解释两者之间的区别吗? 回答1 简而言之: SimpleXml 用于简单的XML和/或简单的UseCases 有限的API可与节点配合使用(例如,无法对接口进行太多编程) 所有节点都属于同一种类(元素节点与属性节点相同) 节点可以魔术访问,例如$root->foo->bar['attribute'] 判断 适用于您可能拥有的任何XML UseCase 是W3C DOM API的实现(发现有多种语言实现) 区分各种节点类型(更多控制权) 由于使用显式API,因此更加冗长(可以对接口进行编码) 可以解析损坏的HTML 允许您在XPath查询中使用PHP函数 这两个都是基于libxml的,并且可以受libxml函数的某些扩展影响 就个人而言,我不太喜欢SimpleXml。 那是因为我不喜欢对节点的隐式访问,例如$foo->bar[1]->baz['attribute'] 。 它将实际的XML结构与编程接口联系在一起。 一切都是单节点类型也有些不直观,因为SimpleXmlElement的行为根据其内容而神奇地改变。 例如,当你有<foo bar="1"/>的对象转储/foo/@bar将是完全相同的/foo但做他们的回声将打印不同的结果。 而且,由于它们都是SimpleXml元素,因此可以在它们上调用相同的方法
  • SimpleXML:将一棵树追加到另一棵树(SimpleXML: append one tree to another)
    问题 我有两棵XML树,想将一棵树作为叶子添加到另一棵树中。 显然: $tree2->addChild('leaf', $tree1); 不起作用,因为它仅复制第一个根节点。 好的,所以我想我会遍历整个第一棵树,将每个元素一个接一个地添加到第二棵树上。 但是像这样考虑XML: <root> aaa <bbb/> ccc </root> 如何访问“ ccc”? tree1->children()仅返回“ bbb” ...。 回答1 如您所见,您不能直接使用SimpleXML添加“树”。 但是,您可以使用某些DOM方法为您完成繁重的工作,同时仍在处理相同的基础XML。 $xmldict = new SimpleXMLElement('<dictionary><a/><b/><c/></dictionary>'); $kitty = new SimpleXMLElement('<cat><sound>meow</sound><texture>fuzzy</texture></cat>'); // Create new DOMElements from the two SimpleXMLElements $domdict = dom_import_simplexml($xmldict->c); $domcat = dom_import_simplexml($kitty); //
  • 在 PHP4 中用于 XML 解析/读取的内容(What to use for XML parsing / reading in PHP4)
    问题 不幸的是,我必须在PHP4服务器上使用较旧的 Web 应用程序; 现在需要解析很多XM来调用webservices (custom protocol, no SOAP/REST) ; 在PHP5我会使用SimpleXML但这不可用; PHP4有Dom XML ,但它在PHP5不再是默认值。 其他选项是什么? 我正在寻找一种在PHP5迁移后仍然适用的解决方案。 如果XML可以使用模式进行验证,那么额外的好处是。 回答1 有一个 simpleXML backport 可用:http://www.ister.org/code/simplexml44/index.html 如果您可以安装它,那么这将是最好的解决方案。 回答2 我会第二个 Rich Bradshaw 关于 simpleXML backport 的建议,但如果这不是一个选项,那么 xml_parse 将在 PHP4 中完成这项工作,并且在迁移到 5 后仍然有效。 $xml = ...; // Get your XML data $xml_parser = xml_parser_create(); // _start_element and _end_element are two functions that determine what // to do when opening and closing tags
  • 基本的simpleXML工作示例?(Basic simpleXML working example?)
    问题 看起来PHP中的simpleXML存在很多问题。 我正在Windows上运行最新版本的php,但只是无法使simpleXML的基本示例如文档中所述正常工作。 我的xml文件是: <?xml version="1.0" encoding="ISO-8859-1"?> <programme> <title>Billy Bushwaka</title> <episodeNumber>2</episodeNumber> <description>Billy Bushwaka entertains</description> <url>play.swf</url> </programme> 我的PHP程序是: <?php $xml = simplexml_load_file("local.xml"); $result = $xml->xpath("//programme"); echo "Title: " . $result . "</br>"; ?> 我所得到的是以下内容: 标题:数组 我如何获得“标题:比利·布什瓦卡”? 没有重复的XML数据,所以我不想使用数组。 回答1 SimpleXML 101 首先,请始终在它们代表的节点之后命名您的PHP变量。 // the root node is <programme/> $programme = simplexml_load_file
  • 数组的SimpleXML属性(SimpleXML Attributes to Array)
    问题 有没有更优雅的方法来将SimpleXML属性转义为数组? $result = $xml->xpath( $xpath ); $element = $result[ 0 ]; $attributes = (array) $element->attributes(); $attributes = $attributes[ '@attributes' ]; 我真的不是只为了提取键/值对就必须遍历它。 我需要做的就是将其放入数组,然后继续传递。 我本来以为attributes()在默认情况下会完成,或者至少在给定选项的情况下会这样做。 但是我什至在任何地方都找不到上述解决方案,我不得不自己弄清楚。 我是否使这个复杂化? 编辑: 直到我确定访问@attributes数组是否安全之前,我仍在使用上面的脚本。 回答1 不要直接读取'@attributes'属性,仅供内部使用。 无论如何, attributes()已经可以用作数组,而无需“转换”为实际数组。 例如: <?php $xml = '<xml><test><a a="b" r="x" q="v" /></test><b/></xml>'; $x = new SimpleXMLElement($xml); $attr = $x->test[0]->a[0]->attributes(); echo $attr['a']; // "b"
  • SimpleXML 循环有效但中途中断(SimpleXML loop works but breaks half way through)
    问题 我有一个循环遍历来自 youtube 提要的结果,它工作正常,但最终失败并出现错误: Warning: main() [function.main]: Node no longer exists in ../youtubereader.php on line 8 Warning: main() [function.main]: Node no longer exists in .../youtubereader.php on line 8 Fatal error: Call to a member function attributes() on a non-object in .../youtubereader.php on line 9 我的代码是: <?php error_reporting(E_ALL); $feedURL = 'http://gdata.youtube.com/feeds/api/users/USERNAME/uploads?max-results=50'; $sxml = simplexml_load_file($feedURL); $i=0; foreach ($sxml->entry as $entry) { $media = $entry->children('media', true); $watch = (string)$media-
  • PHP - SimpleXML - AddChild 与另一个 SimpleXMLElement(PHP - SimpleXML - AddChild with another SimpleXMLElement)
    问题 我正在尝试构建一个相当复杂的 XML 文档。 我有一堆重复的 XML 文档部分。 我想我会使用多个字符串模板作为部分的基本文档,并使用 simplexml_load_string 创建 XML 元素的实例。 所以我有一个 SimpleXMLElement 实例作为基础文档 $root = simplexml_load_string($template_root); 然后我遍历数据库中的一些项目,创建新的 SimpleXMLElement,如下所示: 对于(bla bla bla): $item = simplexml_load_string($template_item); // 对 item 做一些事情 // 尝试将 item 添加到根文档中.. // 卡在这里.. 不能做 $root->items->addChild($item) 结束; 我不能调用 addChild 因为它只需要一个标签名称和值..你不能 addChild 另一个 SimpleXMLElement。 我在这里错过了什么吗? addChild 不能将 SimpleXMLELement 作为参数似乎真的很愚蠢。 有没有其他方法可以做到这一点? (除了使用不同的 xml 库) 回答1 据我所知,你不能用 SimpleXML 做到这一点,因为addChild不会制作元素的深层副本