标签: xpath

使用包含多个值的 XPath 查询

我需要一个 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 xml xpath simplexml

1
推荐指数
1
解决办法
9008
查看次数

XPath 结果为 PHP 中的命名键数组

用 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)

如何获得命名键而不是编号键?

php xpath dom

1
推荐指数
1
解决办法
3844
查看次数

为什么 XSLT 不喜欢我的 XPath 查询?

我有一个 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']]/ ​​-->..<--

xml xslt xpath

1
推荐指数
1
解决办法
1421
查看次数

具有可变多条件的 XPath 查询

长期聆听者,初次来电者。我对 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'或其他内容。|工会也没有运气。

提前致谢。

哦,如果重要的话,查询需要动态构建(从表单输入),所以它需要保留一个通用语法,可以与任意数量的用户提供的标准一起使用。

xml xslt xpath

1
推荐指数
1
解决办法
2万
查看次数

XPath 严格 contains() 函数

我正在使用 xpath 的 contains 函数来查找包含一些文本的元素,如下所示:

//td[contains(text(),'foo')]
Run Code Online (Sandbox Code Playgroud)

但是,例如,如果页面包含两个td元素,分别包含foofoo bar,则上述 xpath 将同时返回它们。是否有任何一种严格contains,只返回带有文本的元素foo,而不返回带有文本的元素foo bar

xpath

1
推荐指数
1
解决办法
1064
查看次数

获取 XMLNode 属性的值

我正在研究 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 vb.net asp.net xpath

1
推荐指数
1
解决办法
7423
查看次数

对 XML 文件进行排序

是否可以对 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 这样的东西来旋转我自己的?

python xml sorting xslt xpath

1
推荐指数
1
解决办法
4583
查看次数

如何选择使用默认命名空间的节点?

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)

c# xml xpath xsd xml-namespaces

1
推荐指数
1
解决办法
1759
查看次数

php 和 xpath - 循环遍历特定元素的子元素

我想遍历以下 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)

php xpath simplexml

1
推荐指数
1
解决办法
5436
查看次数

Python Scrapy 动态网站

我试图在 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)

我得到了正确的元素,但是当我尝试访问里面的选项时,它什么也没得到

html python xml xpath scrapy

1
推荐指数
1
解决办法
4940
查看次数

标签 统计

xpath ×10

xml ×7

php ×3

xslt ×3

python ×2

simplexml ×2

asp.net ×1

c# ×1

dom ×1

html ×1

scrapy ×1

sorting ×1

vb.net ×1

xml-namespaces ×1

xsd ×1