【问题标题】:xpath union operator with VTD XML Parser带有 VTD XML 解析器的 xpath 联合运算符
【发布时间】:2017-03-30 23:09:37
【问题描述】:

有人可以发布一个在 VTD XML 解析器中使用联合运算符 (|) 的示例吗? 以下不适用于 VTD XML 解析器,但适用于 jxpath 解析器。 /一个 | /b

【问题讨论】:

  • 不工作?我对此表示怀疑,但会检查
  • 感谢您的及时回复。如果有使用联合运算符的正确格式,请同时粘贴。
  • 它的哪一部分不起作用? xpath 编译失败?还是评估失败?
  • 评估失败。例如,如果 a 没有值但 b 有值,则返回的值为 null。期望是用联合运算符返回 b 的值。
  • 我正在尝试的 xpath 是 /a | /b。是否有任何特定格式可以将联合运算符与 VTD XML 解析器一起使用?

标签: vtd-xml


【解决方案1】:

好的,这是联合表达式的一个简单示例。

import com.ximpleware.AutoPilot;
import com.ximpleware.NavException;
import com.ximpleware.VTDException;
import com.ximpleware.VTDGen;
import com.ximpleware.VTDNav;


/**
 * An issue that seems to exist in VTD-XML 2.12 and 2.13 (but not 2.11) that causes lookups for default namespace nodes
 * to also pickup non-default namespaced nodes.
 */
public class VtdAutoPilotXpathIssueTest {

  private static final String XML = "<a xmlns:x=\"" + "urn:test" + "\"><b id=\"1\"/><x:b id=\"2\"/><b id=\"3\"/></a>";
  public static void main(String[] s) throws VTDException{
      VTDGen vg = new VTDGen();
      vg.setDoc(XML.getBytes());
      vg.parse(false);
      VTDNav vn = vg.getNav();
      AutoPilot ap = new AutoPilot(vn);
      ap.declareXPathNameSpace("abc", "urn:test");
      ap.selectXPath("//b|/a");
      int i=0;
      while((i=ap.evalXPath())!=-1){
          System.out.println(" token "+ vn.toRawString(i));
      }
  }
}

【讨论】:

  • 谢谢。但是你能换个方式试试吗? (/a|/b) 或 (//a|/b)。上周这对我不起作用。通常,这在 xpath 左侧定义的变量有值时有效,但在右侧定义的变量只有值时不起作用。
  • 当然可以,但 //b 不会为上面的 xml 文件返回单个节点。
  • 请尝试此 XML 以及以下更改。其余代码保持不变。尽管 c 没有值,但期望是得到 b 的值 (1)。联合运算符可以获取任何不为空的值。但我得到一个空值。
  • 私有静态最终字符串 XML = "1"; ap.selectXPath("//c|/b");在 while 循环中,您可以添加以下内容: vn.recoverNode(i); System.out.println("值" + vn.toNormalizedString(vn.getText()));
  • 你能试试这个并确认吗?这会很有帮助。
猜你喜欢
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
相关资源
最近更新 更多