【问题标题】:parsing table in XPATHXPATH 中的解析表
【发布时间】:2011-03-04 11:20:55
【问题描述】:
<TR>
 <TD>Field 1</TD>
 <TD colSpan=2>Field 2</TD>
 <TD>Field 3</TD>
</TR>
<TR>
 <TD>Value for Field1</TD>
 <TD colSpan=2>Value for Field2</TD>
 <TD>Value for Field3</TD>
<TR></TR>
</TR>

如何将字段映射到其值?我正在使用 XPATH 解析我的 html 文件。

主要问题是每个输入中的字段数量都会发生变化..但是您知道布局将是相同的....

【问题讨论】:

  • 您能否发布您的 XPath 字符串,以便我们更好地了解您卡在哪里?
  • 好问题,+1。请参阅我的答案,以获得一个简短的 XPath 表达式,即使在两行具有不同数量的 TDs 的情况下也可以选择正确的节点。 :)

标签: java xpath nsxmlparser


【解决方案1】:

这将选择您的字段名称:

//table/tr[position() mod 2 = 0]/td/text()

这将选择你的字段值:

//table/tr[position() mod 2 = 1]/td/text()

【讨论】:

  • 抱歉,您遇到了错误。当您真正尝试在提供的 XML 文档上应用这些表达式时,您将看到没有选择任何节点。请正确。
【解决方案2】:

这个 XPath 表达式

/*/*[2]/TD
         [position()
         =
         count(/*/*[1]
                    /TD[.=$pName]/preceding-sibling::TD
              ) +1
         ]

选择“值”对应于变量pName中指定的“名称”的TD

因此,如果将上述表达式中的$pName 替换为'Field 2',则会选择以下内容:

<TD colSpan="2">Value for Field2</TD>

注意:即使在两行有不同数量的TDs 的情况下,此 XPath 表达式也会选择正确的节点。

要仅选择 TD 的文本子节点,/text() 附加到表达式。

要仅获取字符串值,请使用

  string(/*/*[2]/TD
             [position()
             =
             count(/*/*[1]
                        /TD[.=$pName]/preceding-sibling::TD
                  ) +1
             ]
        )

这是一个简短的 XSLT 转换,证明已检索到所需值

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:param name="pName" select="'Field 2'"/>

 <xsl:template match="/">
  <xsl:value-of select=
   "/*/*[2]/TD
             [position()
             =
             count(/*/*[1]
                        /TD[.=$pName]/preceding-sibling::TD
                  ) +1
             ]
   "/>
 </xsl:template>
</xsl:stylesheet>

当对提供的 XML 文档应用此转换时(固定为格式正确):

<TABLE>
    <TR>
        <TD>Field 1</TD>
        <TD colSpan="2">Field 2</TD>
        <TD>Field 3</TD>
    </TR>
    <TR>
        <TD>Value for Field1</TD>
        <TD colSpan="2">Value for Field2</TD>
        <TD>Value for Field3</TD>
        <TR></TR></TR>
</TABLE>

产生了想要的结果:

Value for Field2

【讨论】:

    【解决方案3】:

    有了这个输入:

    <TABLE>
        <TR>
            <TD>Field 1</TD>
            <TD colSpan="2">Field 2</TD>
            <TD>Field 3</TD>
        </TR>
        <TR>
            <TD>Value for Field1</TD>
            <TD colSpan="2">Value for Field2</TD>
            <TD>Value for Field3</TD>
        </TR>
    </TABLE>
    

    这个 XPath 表达式:

    /TABLE/TR/TD[.='Field 3']/following::TD[count(../TD)]
    

    它选择这个元素:

    <TD>Value for Field3</TD>
    

    注意:这假定一个“常规”表。

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 1970-01-01
      • 2010-11-24
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      • 2014-05-10
      相关资源
      最近更新 更多