<blockquote>XPath通过路径和条件精准筛选XML节点,核心是利用路径表达式、谓词过滤及函数组合实现高效数据提取,并可集成于Python、Java等语言处理复杂结构。</blockquote>
<p><img src="https://img.php.cn/upload/article/001/221/864/175833618261996.jpg" alt="如何用xpath筛选xml数据"></p>
<p>XPath通过路径表达式在XML文档中定位并选择节点,是筛选XML数据的强大工具,其核心在于精确指定所需数据的路径和条件,从而高效地提取所需信息。</p>
<h3>解决方案</h3>
<p>要用XPath筛选XML数据,首先需要理解其基本语法和核心概念。在我看来,XPath就像是给XML文件绘制一张寻宝图。它允许你通过元素的名称、属性、文本内容,甚至是它们在文档中的位置来找到目标。</p>
<p>最基础的,我们用路径来导航:</p>
<ul>
<li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">/</pre>
登录后复制
</div>:表示根节点。例如,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">/root</pre>
登录后复制
</div>会选择XML文档的根元素<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">root</pre>
登录后复制
</div>。</li>
<li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//</pre>
登录后复制
</div>:表示从当前节点向下,在任何层级匹配元素。这是我最常用也最喜欢的一个,因为它能省去很多中间路径的麻烦。比如,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//book</pre>
登录后复制
</div>会选择文档中所有名为<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">book</pre>
登录后复制
</div>的元素,无论它们在哪一层。</li>
<li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">elementName</pre>
登录后复制
</div>:选择当前节点的子元素。例如,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">/library/book</pre>
登录后复制
</div>会选择<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">library</pre>
登录后复制
</div>下的所有<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">book</pre>
登录后复制
</div>子元素。</li>
<li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">@attributeName</pre>
登录后复制
</div>:选择元素的属性。比如,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//book/@id</pre>
登录后复制
</div>会选择所有<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">book</pre>
登录后复制
</div>元素的<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">id</pre>
登录后复制
</div>属性。</li>
<li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">text()</pre>
登录后复制
</div>:选择元素的文本内容。例如,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//book/title/text()</pre>
登录后复制
</div>会选择所有<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">book</pre>
登录后复制
</div>下<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">title</pre>
登录后复制
</div>元素的文本。</li>
</ul>
<p>筛选的核心在于使用谓词(<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">[]</pre>
登录后复制
</div>)。这就像是给你的寻宝指令加上了具体的条件:</p>
<ul>
<li>
<strong>按属性值筛选</strong>:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//book[@category='fiction']</pre>
登录后复制
</div>,这会找出所有<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">category</pre>
登录后复制
</div>属性值为<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">fiction</pre>
登录后复制
</div>的<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">book</pre>
登录后复制
</div>元素。这是非常常见的操作。</li>
<li>
<strong>按元素内容筛选</strong>:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//book[title='The Hobbit']</pre>
登录后复制
</div>,找出<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">title</pre>
登录后复制
</div>子元素内容为<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">The Hobbit</pre>
登录后复制
</div>的<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">book</pre>
登录后复制
</div>。</li>
<li>
<strong>按位置筛选</strong>:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//book[1]</pre>
登录后复制
</div>会选择第一个<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">book</pre>
登录后复制
</div>元素,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//book[last()]</pre>
登录后复制
</div>则选择最后一个。</li>
<li>
<strong>组合条件</strong>:你可以用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">and</pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">or</pre>
登录后复制
</div>来连接多个条件,比如<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//book[@category='fiction' and price > 20]</pre>
登录后复制
</div>。</li>
</ul>
<p>一个简单的XML示例:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:xml;toolbar:false;'><library>
<book id="b001" category="fiction">
<title>The Lord of the Rings</title>
<author>J.R.R. Tolkien</author>
<price>25.00</price>
</book>
<book id="b002" category="science">
<title>Cosmos</title>
<author>Carl Sagan</author>
<price>30.00</price>
</book>
<book id="b003" category="fiction">
<title>1984</title>
<author>George Orwell</author>
<price>15.50</price>
</book>
</library></pre>
登录后复制
</div><p>如果你想筛选出所有价格高于20的虚构类书籍,XPath表达式就是:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//book[@category='fiction' and price > 20]</pre>
登录后复制
</div>。</p>
<h3>XPath表达式中如何实现复杂条件筛选?</h3>
<p>复杂条件筛选是XPath真正展现其威力的地方。它不仅仅是简单的<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">等于</pre>
登录后复制
</div>或<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">大于</pre>
登录后复制
</div>,你可以利用各种函数和逻辑运算符来构建非常精细的查询。在我日常工作中,遇到需要从海量XML数据中提取特定信息时,这些高级筛选技巧简直是救星。</p>
<ul>
<li>
<strong>多条件组合与否定</strong>:<ul>
<li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">and</pre>
登录后复制
</div>和<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">or</pre>
登录后复制
</div>是最基本的逻辑连接符。比如,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//book[author='J.R.R. Tolkien' or author='George Orwell']</pre>
登录后复制
</div>会找出这两位作者的书。</li>
<li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">not()</pre>
登录后复制
</div>函数可以用于否定一个条件。比如,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//book[not(@category='science')]</pre>
登录后复制
</div>会选择所有非科学类的书籍。这在排除某些特定数据时特别有用。</li>
</ul>
</li>
<li>
<strong>字符串匹配函数</strong>:<ul>
<li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">contains(string, substring)</pre>
登录后复制
</div>:检查一个字符串是否包含另一个子字符串。例如,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//book[contains(title, 'Lord')]</pre>
登录后复制
</div>会匹配标题中包含"Lord"的书。</li>
<li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">starts-with(string, substring)</pre>
登录后复制
</div>:检查一个字符串是否以某个子字符串开头。</li>
<li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">ends-with(string, substring)</pre>
登录后复制
</div>(XPath 2.0+):检查一个字符串是否以某个子字符串结尾。这些对于模糊匹配或者部分匹配非常实用。</li>
</ul>
</li>
<li>
<strong>数字与比较</strong>:<ul><li>除了<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">></pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;"><</pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">>=</pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;"><=</pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">=</pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">!=</pre>
登录后复制
</div>这些,你还可以对数值进行简单的计算。例如,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//book[price * 1.1 > 30]</pre>
登录后复制
</div>。</li></ul>
</li>
<li>
<strong>节点集操作</strong>:<ul>
<li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">count(node-set)</pre>
登录后复制
</div>:返回节点集中元素的数量。你可以用它来筛选那些包含特定数量子元素的节点,比如<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//chapter[count(section) > 5]</pre>
登录后复制
</div>。</li>
<li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">position()</pre>
登录后复制
</div>:返回当前节点在节点集中的位置。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//item[position() mod 2 = 0]</pre>
登录后复制
</div>可以用来选择偶数位置的<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">item</pre>
登录后复制
</div>。</li>
</ul>
</li>
<li>
<strong>处理缺失数据</strong>:<ul><li>有时候,某个元素或属性可能不存在。在XPath 2.0及更高版本中,你可以使用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">exists()</pre>
登录后复制
</div>函数来检查节点是否存在,比如<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//product[exists(@discount)]</pre>
登录后复制
</div>。对于XPath 1.0,通常会通过<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">self::node()</pre>
登录后复制
</div>或者更复杂的逻辑来间接判断。</li></ul>
</li>
</ul>
<p>这些组合起来,几乎能让你在XML文档中“无所不能”地定位和筛选数据。关键在于,你要对你的XML结构有深入的理解,并且能够清晰地将你的筛选逻辑翻译成XPath表达式。这通常需要一些练习和试错。</p>
<h3>XPath在不同<a style="color:#f60; text-decoration:underline;" title="编程语言" href="https://www.php.cn/zt/16832.html" target="_blank">编程语言</a>中如何集成与应用?</h3>
<p>XPath的强大之处在于它不仅仅是一种查询语言,更因为它能无缝集成到各种主流编程语言中,成为处理XML数据的利器。坦白说,如果只是手动查看XML,XPath的价值有限,但一旦与代码结合,它的效率和灵活性就凸显出来了。</p>
<ul>
<li>
<p><strong>Python</strong>:</p>
<div class="aritcle_card">
<a class="aritcle_card_img" href="/ai/1733">
<img src="https://img.php.cn/upload/ai_manual/000/969/633/68b6d1ec912e3543.png" alt="Spirit Me">
</a>
<div class="aritcle_card_info">
<a href="/ai/1733">Spirit Me</a>
<p>SpiritMe允许用户使用数字化身制作视频,这些化身可以模拟用户的声音和情感</p>
<div class="">
<img src="/static/images/card_xiazai.png" alt="Spirit Me">
<span>178</span>
</div>
</div>
<a href="/ai/1733" class="aritcle_card_btn">
<span>查看详情</span>
<img src="/static/images/cardxiayige-3.png" alt="Spirit Me">
</a>
</div>
<ul>
<li>
<p>Python社区中最常用的XML处理库是<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">lxml</pre>
登录后复制
</div>,它提供了非常高效且功能完整的XPath支持。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'>from lxml import etree
xml_string = """
<library>
<book id="b001" category="fiction">
<title>The Lord of the Rings</title>
<author>J.R.R. Tolkien</author>
</book>
<book id="b002" category="science">
<title>Cosmos</title>
<author>Carl Sagan</author>
</book>
</library>
"""
root = etree.fromstring(xml_string)
# 查找所有作者
authors = root.xpath('//author/text()')
print(f"Authors: {authors}") # 输出 ['J.R.R. Tolkien', 'Carl Sagan']
# 查找所有虚构类书籍的标题
fiction_titles = root.xpath("//book[@category='fiction']/title/text()")
print(f"Fiction Titles: {fiction_titles}") # 输出 ['The Lord of the Rings']</pre>
登录后复制
</div></li>
<li><p>Python标准库中的<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">xml.etree.ElementTree</pre>
登录后复制
</div>也支持简单的XPath路径,但功能不如<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">lxml</pre>
登录后复制
</div>强大。</p></li>
</ul>
</li>
<li>
<p><strong>Java</strong>:</p>
<ul>
<li>
<p>Java通过JAXP (Java API for XML Processing) 提供了内置的XPath支持,主要通过<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">javax.xml.xpath</pre>
登录后复制
</div>包。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:java;toolbar:false;'>import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import java.io.ByteArrayInputStream;
public class XPathJavaExample {
public static void main(String[] args) throws Exception {
String xmlString = "<library><book id=\"b001\" category=\"fiction\"><title>The Lord of the Rings</title></book></library>";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(xmlString.getBytes()));
XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "//book[@category='fiction']/title/text()";
NodeList nodes = (NodeList) xpath.evaluate(expression, doc, XPathConstants.NODESET);
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i).getNodeValue()); // 输出 The Lord of the Rings
}
}
}</pre>
登录后复制
</div></li>
<li><p>Java的XPath API虽然略显冗长,但非常稳定和规范,适合企业级应用。</p></li>
</ul>
</li>
<li>
<p><strong>JavaScript (<a style="color:#f60; text-decoration:underline;" title="浏览器" href="https://www.php.cn/zt/16180.html" target="_blank">浏览器</a>环境)</strong>:</p>
<ul>
<li>在浏览器中,你可以直接在DOM对象上使用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">document.evaluate()</pre>
登录后复制
</div>方法来执行XPath查询,这在<a style="color:#f60; text-decoration:underline;" title="前端" href="https://www.php.cn/zt/15813.html" target="_blank">前端</a>抓取或处理页面数据时非常有用。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:javascript;toolbar:false;'>// 假设页面上有一个XML结构(或者通过DOMParser解析的文档)
// var xmlDoc = new DOMParser().parseFromString(xmlString, "text/xml");
// 这里以当前HTML文档为例
var result = document.evaluate('//h1', document, null, XPathResult.ANY_TYPE, null);
var node = result.iterateNext();
while (node) {
console.log(node.textContent);
node = result.iterateNext();
}</pre>
登录后复制
</div></li>
<li>Node.<a style="color:#f60; text-decoration:underline;" title="js" href="https://www.php.cn/zt/15802.html" target="_blank">js</a>环境则需要借助第三方库,例如<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">xpath</pre>
登录后复制
</div>或<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">xmldom</pre>
登录后复制
</div>。</li>
</ul>
</li>
</ul>
<p>需要特别指出的是,在实际应用中,命名空间(XML Namespaces)常常是初学者集成XPath时遇到的一个“坑”。如果你的XML文档使用了命名空间,直接用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//elementName</pre>
登录后复制
</div>可能找不到任何东西。你需要正确地映射命名空间前缀,或者在某些情况下,使用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">local-name()</pre>
登录后复制
</div>函数来忽略命名空间前缀,例如<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//*[local-name()='elementName']</pre>
登录后复制
</div>。处理命名空间是集成XPath时一个需要特别注意的细节。</p>
<h3>面对不规范或结构复杂的XML,XPath有哪些应对策略?</h3>
<p>现实世界中的XML数据很少像教程里那么完美,结构不一致、某些节点缺失、或者存在混合内容是常态。面对这种“脏数据”,纯粹依赖精确路径的XPath可能会碰壁,但XPath的灵活性和一些技巧能帮助我们应对大部分挑战。</p>
<ul>
<li>
<strong>处理可选元素或属性</strong>:<ul>
<li>如果某个元素或属性可能存在也可能不存在,直接用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//parent/child</pre>
登录后复制
</div>可能会漏掉数据。你可以通过<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">or</pre>
登录后复制
</div>逻辑来处理。例如,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//item[price or @discount]</pre>
登录后复制
</div>会选择有价格或有折扣属性的<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">item</pre>
登录后复制
</div>。</li>
<li>在XPath 2.0+中,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">exists()</pre>
登录后复制
</div>函数是检查节点或属性是否存在的好方法,比如<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//product[exists(@specialOffer)]</pre>
登录后复制
</div>。</li>
</ul>
</li>
<li>
<strong>模糊匹配与部分匹配</strong>:<ul>
<li>当文本内容不完全确定时,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">contains()</pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">starts-with()</pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">ends-with()</pre>
登录后复制
</div>这些字符串函数就显得尤为重要。比如,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//log[contains(message, 'ERROR')]</pre>
登录后复制
</div>可以找出所有日志消息中包含“ERROR”的记录。</li>
<li>对于属性值,也可以类似处理:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//user[starts-with(@id, 'guest_')]</pre>
登录后复制
</div>。</li>
</ul>
</li>
<li>
<strong>处理混合内容和文本节点</strong>:<ul><li>XML元素可能包含文本和子元素,即所谓的混合内容。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">text()</pre>
登录后复制
</div>函数可以选取文本节点,但如果文本被多个子元素分割,你可能需要选取所有文本节点并拼接。例如,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">normalize-space(.)</pre>
登录后复制
</div>可以获取当前节点下所有文本内容的拼接并去除多余空白。</li></ul>
</li>
<li>
<strong>应对命名空间挑战</strong>:<ul>
<li>这绝对是复杂XML数据处理中最常见的问题之一。如果XML文档使用了命名空间,比如<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;"><ns:data xmlns:ns="http://example.com/ns"></pre>
登录后复制
</div>,你直接用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//data</pre>
登录后复制
</div>是找不到的。你需要注册命名空间前缀并在XPath表达式中使用它,例如<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//ns:data</pre>
登录后复制
</div>。</li>
<li>如果命名空间前缀不固定或你不想关心它,一个“野路子”但常用的技巧是使用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">local-name()</pre>
登录后复制
</div>函数来匹配元素名,忽略命名空间前缀。例如,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//*[local-name()='data']</pre>
登录后复制
</div>会匹配所有名为<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">data</pre>
登录后复制
</div>的元素,无论其命名空间前缀是什么。但请注意,这会失去命名空间的语义信息。</li>
</ul>
</li>
<li>
<strong>利用通配符和轴</strong>:<ul>
<li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">*</pre>
登录后复制
</div>通配符可以匹配任何元素名,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">@*</pre>
登录后复制
</div>可以匹配任何属性名。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//*</pre>
登录后复制
</div>会选择文档中的所有元素。</li>
<li>XPath的轴(Axes)如<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">parent::</pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">following-sibling::</pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">preceding-sibling::</pre>
登录后复制
</div>等,能让你在文档中进行更复杂的导航,不局限于父子关系,这在结构不规整时非常有用。例如,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//book[preceding-sibling::separator]</pre>
登录后复制
</div>可以找到紧跟在<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">separator</pre>
登录后复制
</div>元素后面的<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">book</pre>
登录后复制
</div>。</li>
</ul>
</li>
</ul>
<p>说到底,面对不规范的XML,XPath的策略是:尽可能利用其灵活的路径和函数来定位数据,但也要清楚它的局限性。有时候,纯粹的XPath表达式</p>
以上就是如何用XPath筛选XML数据的详细内容,更多请关注php中文网其它相关文章!