- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试获取/td/span 的所有文本节点。
我正在尝试使用 xpath/td/span/text()
问题是它返回每个文本元素的所有文本节点(这里有两个,“193”和“120”,它返回两次“193120”,而不是在单独的元素中返回 193 和 120)。
我在任何在线工具上尝试了完全相同的 xpath,它工作正常,在 php 中,结果完全不同。
使用 SimpleXMLElement
$xhtmlSnippet = '<td><span>193<span>10</span><span></span><div>66</div><span>195</span><span>.</span><span>34</span><span>242</span><span></span>120<span>64</span></span></td>';
$xml = new SimpleXMLElement($xhtmlSnippet);
$xresult = $xml->xpath('/td/span/text()');
foreach($xresult as $xnode){
echo "<br /><br />NodeValue: " . $xnode;
}
给我:
NodeValue: 193120
NodeValue: 193120
这是它通过在线工具正常工作的示例(所有其他在线工具也提供预期的输出):
Working example in online tester
编辑:
使用 DOMDocument + DOMXPath,它似乎按预期工作:
$dom = new DOMDocument;
$dom->loadXML($xhtmlSnippet);
$xpath = new DOMXPath($dom);
foreach ($xpath->query('/td/span/text()) as $textNode) {
echo "\n\nTextNode: " . $textNode->nodeValue;
}
给予:
TextNode: 193
TextNode: 120
最佳答案
SimpleXMLElement 只能表示元素和属性,可以单独表示,也可以表示相同类型的兄弟元素的集合。 ->xpath()
method返回一个 SimpleXMLElement 对象数组,允许它们成为非兄弟节点,但不允许任何其他节点类型。
因此,表达式 /td/span/text()
匹配两个文本节点,但将它们作为代表其父元素的对象返回,在本例中恰好是相同的 <span>
元素,两次为您提供具有相同对象的数组。
难题的其余部分是,当您将 SimpleXML 元素转换为字符串时,它将所有直接后代文本和 CDATA 节点合并为一个字符串,因此 193
和 120
粘在一起。
因此输出为193120
, 两次。
(这绝对是不符合直觉的行为,尽管很难确切地知道 SimpleXML 在这种情况下应该做什么;如果 XPath 表达式解析为元素或属性以外的其他内容,也许产生错误会更好)。
由于 DOM API 具有可能存在于 XML 中的每种节点的对象,并且 PHP 包含该 API 的完整实现,因此 XPath 表达式将在那里按预期工作。更重要的是,SimpleXML 和 DOM 对象实际上都是相同内部内存结构的包装器,因此您可以使用 dom_import_simplexml()
编写将两者组合的操作。和 simplexml_import_dom()
.
作为一个稍微不雅的示例,如果您想在您已经使用 SimpleXML 遍历过的元素的上下文中运行 XPath 表达式,您可以这样做:
$dom_node = dom_import_simplexml($simplexml_node);
$dom_xpath = new DOMXPath($dom_node->ownerDocument);
$dom_xpath_result = $dom_xpath->query('span/text()', $dom_node);
foreach($dom_xpath_result as $xnode){
echo "<br /><br />NodeValue: " . $xnode->nodeValue;
}
显然,您可以根据需要将其包装到一个函数中。另请注意,由于您的表达式从文档根目录(前导 /
)开始,因此实际上下文无关紧要,这就是为什么我在上面使用了稍微不同的表达式。
关于带有 text() 和 SimpleXMLElement->xpath 的 php xpath 不符合 xpath 预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19847451/
我们如何让 SwiftUI 对象,尤其是 Image,符合 Hashable 协议(protocol)? 我知道它们符合 Equatable 协议(protocol),所以主要问题是如何获取哈希值,或
我遇到了一些符合 AVAudioPlayerDelegate 的奇怪问题。以下正是我在一个全新的 Xcode 项目中所拥有的: import UIKit import AVFoundation cla
我一辈子都弄不明白为什么我会收到此类不符合 NSCoding 协议(protocol)的错误。也许另一双眼睛会有所帮助。我试图添加注释以明确每个函数在做什么。 import Foundation im
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
所有现代浏览器都理解 HTML,所以除了在键盘最右侧编写更多字符之外,兼容 XHTML 的意义何在。 最佳答案 没有一点我能想到的。 W3C 已经取消了 XHTML 2.0,尽管应该有一个 XHTML
我正在设计一个订单系统,状态设计模式似乎很合适,因为订单可以更改其状态,从而更改订单允许的功能。下面是我的基本类图: 我不喜欢这种方法,因为客户端无法查看某个方法是否受支持并且违反了里氏原则。我在下面
我正在考虑使用图形数据库来存储 IFC数据。理想情况下,数据库应该提供一种方法来定义 IFC 架构中定义的所有规则类型。但是,我不认为有任何这样的数据库,因为 IFC 中的某些规则类型非常复杂并且需要
我所在的组织必须满足 FISMA 对启用 FIPS 的系统的要求。我正在尝试做的一件事是为我们的密码实现哈希算法。我对此有很多选择:SHA-2、MD5、bcrypt(使用 Blowfish)、RIPE
我正在尝试实现我的自定义 CoreData Carpark 实体以符合 MKAnnotation,就像我们如何使 class 对象符合 >MKAnnotation. 我根据以下帖子调整了我的实现:th
我在 project-Swift.h 文件中收到名为“CBCentralManagerDelegate”的 No 类型或协议(protocol)。不知道我在这里哪里出错了。我认为这与 swift.h
我正在尝试读取之前写入 NVM 闪存的变量的值。 我的代码是: uintptr_t address = getAddress(); //[MISRA C++ Rule 5-2-8] cast from
所以我有这个练习要解决。我必须创建第一个。一个名为 Printable 的接口(interface),它有一个 put() 方法,该方法将接受实现 Comparable 的对象。 完成 interfa
我的问题涉及 IEEE 754 单精度数字。假设我有一个结构: typedef struct __ieee754 { int sign; int exponent; int mant
我需要使用 map,键为 uint32_t,值为 Meshes。我希望将网格布局在连续的内存中以 boost 性能,因为它们将经常被连续访问。 我想知道有哪些内存分配器库可以提供以下内容; 分配给连续
在处理小对象时,有哪些分配器可用于 STL。我已经尝试过使用 Boost 的池分配器,但没有得到任何性能提升(实际上,在某些情况下性能下降相当大)。 最佳答案 你没有说你使用的是什么编译器,但它可能带
我想做什么 我有一种划分事物的方法。此方法不会对数组进行完全排序;它只是简单地对数组进行分区,以便一侧的所有元素(某些预先确定的“中心”或“中点值”——但它不必导致均匀拆分)小于“中心”和另一侧的所有
假设我需要开发一个 REST 银行应用程序允许创建/销毁银行账户以及对帐户进行以下操作:withdraw/credit/getBalance。 创建帐户 PUT/银行/约翰 这里我使用 PUT 而不是
假设我有一个 struct 符合我的模型的 Equatable,如下所示: struct Model: Equatable { var a: Int = 0 var b: String
我目前正在研究 Decodable、Encodable 和 friend ,试图理解它背后的“魔法”。 以下是我发现不寻常的一件事: class Person: Decodable { var n
在 Swift 书中,枚举的例子很好用 enum CompassPoint: String { case north, south, east, west } var northCom = C
我是一名优秀的程序员,十分优秀!