我需要一个 XPath,它将选择所有父节点一个具有至少包含值列表之一的属性的子节点。
示例 XML
<mynodes>
<theParentNode>
<theChildNode name="one two" />
</theParentNode>
<theParentNode>
<theChildNode name="one all" />
</theParentNode>
<theParentNode>
<theChildNode name="two" />
</theParentNode>
<theParentNode>
<theChildNode name="all" />
</theParentNode>
</mynodes>
Run Code Online (Sandbox Code Playgroud)
我想选择名称包含“一个”或“所有”(或任何其他组合)的所有节点。所以返回的 nodeList 是:
<theParentNode>
<theChildNode name="one two" />
</theParentNode>
<theParentNode>
<theChildNode name="one all" />
</theParentNode>
<theParentNode>
<theChildNode name="all" />
</theParentNode>
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的查询看起来像这样(注意我没有使用架构):
//theChildNode[contains(tokenize(@name, '\s'), "one")]
这将使我获得所有在其名称属性中包含“一”的供应商元素。但我不确定如何提供多个值来代替“一个”,然后是回到theParentNode. 如果可能的话,我总是可以在 php 中完成所有这些,但 id 而不是仅使用 XPath 来完成。
用 PHP 解析 Dom 很痛苦。当然,如果您看看使用 JavaScript 是多么容易。
这就是我从每个输入元素获取所有属性的方式:
$dom = new DOMDocument();
$dom->loadHTML('<form><input type="text" required /><input type="password" name="password" required /></form>');
$xpath = new DOMXPath($dom);
$result = $xpath->query('//input/@*');
foreach($result as $key=>$value) {
echo $key . ': ' . $value->nodeValue . '<br />';
}
Run Code Online (Sandbox Code Playgroud)
如何获得命名键而不是编号键?
我有一个 XPath 查询试图获取特定文件节点的父节点。当我在 Xselerator 中使用 XPath 评估器时,我的查询没问题,但是当我将它放入我的 XSLT 代码时,它让我很合适。这是我的 XSLT 代码:
<xsl:template match="//*[local-name()='Wix']/*[local-name()='Fragment'][1]/*[local-name()='DirectoryRef']/*[local-name()='Directory'][./@*[local-name()='Name'][.='bin']]/*[local-name()='Component']/*[local-name()='File'][./@*[local-name()='Source'][.='!(wix.SourceDeployDir)\bin\Client.exe']]/..">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
<xsl:element name="RemoveFolder" namespace="{namespace-uri()}">
<xsl:attribute name="Id">DeleteShortcutFolder</xsl:attribute>
<xsl:attribute name="Directory">DesktopFolder</xsl:attribute>
<xsl:attribute name="On">uninstall</xsl:attribute>
</xsl:element>
</xsl:copy>
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑:这是相关的 XML(从较大的文件中清除):
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="INSTALLLOCATION">
<Directory Id="dirBD8892FBCC64DA5924D7F747259B8B87" Name="bin">
<Component Id="cmp92DC8F5323DA73C053179076052F92FF" Guid="{533500C1-ACB2-4A8D-866C-7CDB1DE75524}">
<File Id="fil7C1FC50442FC92D227AD1EDC1E6D259F" KeyPath="yes" Source="!(wix.SourceDeployDir)\bin\Client.exe">
<Shortcut Id="startmenuAdv" Directory="DesktopFolder" Advertise="yes" Name="!(wix.ProductName)" WorkingDirectory="INSTALLDIR" Icon="Icon.exe">
<Icon Id="Icon.exe" SourceFile="!(wix.SourceDeployDir)\Safeguard.SPI2.Client.exe" />
</Shortcut>
<netfx:NativeImage Id="ClientNativeImageId" Platform="64bit" Priority="0" AppBaseDirectory="INSTALLLOCATION" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension" />
</File>
</Component></Directory></DirectoryRef></Fragment></Wix>
Run Code Online (Sandbox Code Playgroud)
我想要做的就是获取 Component 节点。Visual Studio 给了我以下错误:谓词之外的模式中只允许使用“子”和“属性”轴。...in\Client.exe']]/ -->..<--
长期聆听者,初次来电者。我对 XPath 比较陌生,并查看了此处和其他地方的其他几个线程,但我似乎无法使查询正常工作,任何帮助都会很棒。
我有如下 XML:
<catalog>
<book pgid="28054" lang="en">
<title>The Brothers Karamazov</title>
<author>Dostoyevsky, Fyodor</author>
<friendly_title>The Brothers Karamazov by Fyodor Dostoyevsky</friendly_title>
<file>
<type>ePub</type>
<path>cache/generated/28054/</path>
<name>pg28054.epub</name>
<size>800</size>
</file>
<file>
<type>PDF</type>
<path>2/8/0/5/28054/</path>
<name>28054-pdf.pdf</name>
<size>5829</size>
</file>
<file>
<type compression="zipped">PDF</type>
<path>2/8/0/5/28054/</path>
<name>28054-pdf.zip</name>
<size>1693</size>
</file>
<file>
<type encoding="utf-8" compression="zipped">Text</type>
<path>2/8/0/5/28054/</path>
<name>28054-0.zip</name>
<size>726</size>
</file>
</book>
</catalog>
Run Code Online (Sandbox Code Playgroud)
(catalog 是根元素,在这个例子中没有<contributor>元素)
我有关于作者、贡献者、标题和语言搜索的查询,但我在添加文件类型条件时遇到了麻烦。此查询查找作者或贡献者包含“陀思妥耶夫斯基”和标题包含“兄弟”且语言为“en”的书籍正在工作(即给出预期结果),但如果有更好的编写方式,我会全力以赴:
/catalog//book/*[(contains(self::author,'Dostoyevsky') or contains(self::contributor,'Dostoyevsky')) and contains(../title,'Brothers') and ../@lang = 'en']
Run Code Online (Sandbox Code Playgroud)
我无法开始工作的是将查询结果限制为某种类型的文件,即附加and ../file/type='PDF'或其他内容。|工会也没有运气。
提前致谢。
哦,如果重要的话,查询需要动态构建(从表单输入),所以它需要保留一个通用语法,可以与任意数量的用户提供的标准一起使用。
我正在使用 xpath 的 contains 函数来查找包含一些文本的元素,如下所示:
//td[contains(text(),'foo')]
Run Code Online (Sandbox Code Playgroud)
但是,例如,如果页面包含两个td元素,分别包含foo和foo bar,则上述 xpath 将同时返回它们。是否有任何一种严格contains,只返回带有文本的元素foo,而不返回带有文本的元素foo bar?
我正在研究 asp.net 应用程序。我有一个这样的功能:
Public Function ExtractText(node As XmlNode) As String
End Function
Run Code Online (Sandbox Code Playgroud)
我需要将以下 XML 作为输入传递给上述函数:
<myrequirements Id="7743" Type="tcg_Concept20_sc_323256419566173_context" StartNode="2724" EndNode="2869">
</myrequirements>
Run Code Online (Sandbox Code Playgroud)
然后我需要获取 StartNode 和 EndNode 属性值。
我是否需要使用 XPath。请建议。
问候, 阿西夫
是否可以对 XML 文件进行如下排序:
<model name="ford">
<driver>Bob</driver>
<driver>Alice</driver>
</model>
<model name="audi">
<driver>Carly</driver>
<driver>Dean</driver>
</model>
Run Code Online (Sandbox Code Playgroud)
哪个会变成
<model name="audi">
<driver>Carly</driver>
<driver>Dean</driver>
</model>
<model name="ford">
<driver>Alice</driver>
<driver>Bob</driver>
</model>
Run Code Online (Sandbox Code Playgroud)
也就是说,最外面的元素首先被排序,然后是第二个最外面的元素,依此类推。
它们需要首先按元素名称排序。这能做到吗?或者我应该使用像 BeautifulSoup 这样的东西来旋转我自己的?
XML文件的结构大致如下:
<?xml version="1.0" encoding="UTF-8"?>
<a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="url1" xsi:schemaLocation="url2 url3">
<b>
<c></c>
<c></c>
<c></c>
</b>
</a>
Run Code Online (Sandbox Code Playgroud)
我的目标是选择所有“c”元素,但以下 xpath 表达式不起作用:“//a/b/c”。
IE:
XmlDocument doc= new XmlDocument();
doc.Load(filepath);
XmlNodeList l = doc.SelectNodes("//a/b/c"); // 0 nodes
Run Code Online (Sandbox Code Playgroud)
我测试过的唯一有效的 xpath 表达式是 /*(1 个节点)和 //*(所有节点)。
这个问题是否与 XML 命名空间有关?如果是这样,设置 XMLDocument 对象的正确方法是什么?
XmlDocument doc= new XmlDocument();
doc.Load(filepath);
XmlNamespaceManager m = new XmlNamespaceManager(doc.NameTable);
m.AddNamespace(/* what goes here? */);
XmlNodeList l = doc.SelectNodes("//a/b/c", m);
Run Code Online (Sandbox Code Playgroud) 我想遍历以下 xml 文件中的每个 book_list,并为每个 book_list 循环遍历该 book_list 的每本书。
<inventory>
<book_list>
<book>
<author>Rowling</author>
<title>Harry Potter</title>
</book>
<book>
<author>Blyton</author>
<title>Famous 5</title>
</book>
</book_list>
<book_list>
<book>
<author>Bloggs</author>
<title>Learning XML</title>
</book>
<book>
<author>Jones</author>
<title>Beginning PHP</title>
</book>
</book_list>
</inventory>
Run Code Online (Sandbox Code Playgroud)
对于每个 book_list,我如何在 php simplexml 脚本中使用 xpath 遍历每本书?这是我的代码,
$booklistpath = $xml->xpath('//booklist');
foreach ($booklistpath as $booklist) {
$bookpath = $xml->xpath('//book');
foreach ($bookpath as $book) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
第一个循环很好,它通过每个book_list循环 - 但是嵌套循环,这意味着通过每个book特定的特定循环book_list通过整个文档中的每本书。我也试过:-
'.//book' and
'descendant::book'
Run Code Online (Sandbox Code Playgroud) 我试图在 Scrapy 的帮助下抓取一个非常简单的网页,它是 xpath 选择器,但由于某种原因,我拥有的选择器在 Scrapy 中不起作用,但它们在其他 xpath 实用程序中起作用
我正在尝试解析这段 html:
<select id="chapterMenu" name="chapterMenu">
<option value="/111-3640-1/20th-century-boys/chapter-1.html" selected="selected">Chapter 1: Friend</option>
<option value="/111-3641-1/20th-century-boys/chapter-2.html">Chapter 2: Karaoke</option>
<option value="/111-3642-1/20th-century-boys/chapter-3.html">Chapter 3: The Boy Who Bought a Guitar</option>
<option value="/111-3643-1/20th-century-boys/chapter-4.html">Chapter 4: Snot Towel</option>
<option value="/111-3644-1/20th-century-boys/chapter-5.html">Chapter 5: Night of the Science Room</option>
</select>
Run Code Online (Sandbox Code Playgroud)
Scrapy parse_item 代码:
def parse_item(self, response):
itemLoader = XPathItemLoader(item=MangaItem(), response=response)
itemLoader.add_xpath('chapter', '//select[@id="chapterMenu"]/option[@selected="selected"]/text()')
return itemLoader.load_item()
Run Code Online (Sandbox Code Playgroud)
Scrapy 不会从中提取任何文本,但是如果我得到相同的 xpath 和 html 片段并在此处运行它,它就可以正常工作。
如果我使用这个 xpath:
//select[@id="chapterMenu"]
Run Code Online (Sandbox Code Playgroud)
我得到了正确的元素,但是当我尝试访问里面的选项时,它什么也没得到