XML文档:
<?xml version="1.0" encoding="utf-8"?>
<vdsDataSet>
<date>1900-01-01</date>
<vdsData>
<contractId>contractId1</contractId>
<periodNum>1</periodNum>
...
</vdsData>
<vdsData>
<contractId>contractId2</contractId>
<periodNum>-128</periodNum>
...
</vdsData>
</vdsDataSet>
我正在尝试获取所有合同ID和所有相关的期间编号。所以输出应该如下所示:
contractId1
1
contractId2
-128
现在,我只得到:
contractId1
1
这是我的代码:
VTDGen vg = new VTDGen();
vg.parseFile("vdsDataSet.xml",false);
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
int result = -1;
ap.selectXPath("/vdsDataSet/vdsData/contractId");
while((result = ap.evalXPath())!=-1){
int t = vn.getText(); // get the index of the text (char data or CDATA)
String g = null;
if (t!=-1)
{
g = "" + vn.toNormalizedString(t);
System.out.println(g);
AutoPilot ap2 = new AutoPilot(vn);
ap2.selectXPath("/vdsDataSet/vdsData/periodNum[../contractId=\""+g+"\"]");
int result2= -1;
while((result2 = ap2.evalXPath())!=-1){
int t1 = vn.getText(); // get the index of the text (char data or CDATA)
if (t1!=-1)
System.out.println(""+vn.toNormalizedString(t1));
}
}
}
有人知道我如何解决这个问题,使其显示所有合同ID和相关的期间编号吗?
如果有人能帮我,我将不胜感激。提前感谢!
编辑:Marcus让我先添加通过vdsData循环的版本。这是我的代码:
ap.selectXPath("/vdsDataSet/vdsData");
while((result = ap.evalXPath())!=-1){
AutoPilot ap2 = new AutoPilot(vn);
ap2.selectXPath("/vdsDataSet/vdsData/contractId");
int result2= -1;
while((result2 = ap2.evalXPath())!=-1){
int t1 = vn.getText(); // get the index of the text (char data or CDATA)
if (t1!=-1)
System.out.println(""+vn.toNormalizedString(t1));
}
ap2.selectXPath("/vdsDataSet/vdsData/periodNum");
int result21= -1;
while((result21 = ap2.evalXPath())!=-1){
int t1 = vn.getText(); // get the index of the text (char data or CDATA)
if (t1!=-1)
System.out.println(""+vn.toNormalizedString(t1));
}
不幸的是,这只会产生以下结果:
contractId1
contractId2
1
-128
而不是:
contractId1
1
contractId2
-128
添加了vtd xml作者解决方案的稍微修改版本(以使其打印输出并检索periodnum的正确子元素):
ap.selectXPath("/vdsDataSet/vdsData");
while((result = ap.evalXPath())!=-1){
vn.push();
vn.toElement(VTDNav.FC,"contractId");
int i=-1;
i= vn.getText(); //value for contractID here
System.out.println(vn.toNormalizedString(i)); //added in printlns
//vn.toElement(VTDNav.P);
vn.toElement(VTDNav.NS, "periodNum"); //added in "periodNum" after VTDNav.NS
i=vn.getText();
i= vn.getText(); // value for periodNum here
System.out.println(vn.toNormalizedString(i));
vn.pop();
}
这段代码实际上可以工作并执行我想要的操作...假设有一个periodNum元素...但是如果我有多个periodNum,我该怎么办?
下面是一种方法。还有其他方法,你以后可能会想出来。让我知道它是否适合你。
ap.selectXPath("/vdsDataSet/vdsData");
while((result = ap.evalXPath())!=-1){
vn.push();
vn.toElement(VTDNav.FC,"contractID");
int i=-1;
i= vn.getText(); //value for contractID here
//vn.toElement(VTDNav.P);
vn.toElement(VTDNav.NS);
i=vn.getText();
i= vn.getText(); // value for periodNum here
vn.pop();
}
问题内容: 我有一个数组: 我想获得此数组的第一个元素。预期结果: 字符串 一个要求: 它不能通过引用传递来完成 ,所以不是一个好的解决方案。 我怎样才能做到这一点? 问题答案: 原始答案,但代价昂贵(O(n)): 在O(1)中: 其他用例等 如果修改(就重置数组指针而言)不是问题,则可以使用: 如果需要数组“副本”,则从理论上讲应该更有效: 使用PHP 5.4+(但如果为空,则可能导致索引错误)
返回数组的第一个元素。 使用 arr[0] 返回传递数组的第一个元素。 const head = arr => arr[0]; head([1, 2, 3]); // 1
问题内容: 如何获取与流中的条件匹配的第一个元素?我已经尝试过了但是没用 该条件不起作用,在除Stop之外的其他类中调用filter方法。 问题答案: 这可能是您要寻找的: 一个例子: 输出为:
问题内容: 我有这个数组: 我想要这个数组: 如何从一对货币中提取价值? 问题答案: 您可以使用map来获取元组的第一个元素,如下所示:
问题内容: 我有一个像下面这样的列表,其中第一个元素是id,另一个是字符串: 我只想从此元组列表创建ID列表,如下所示: 我将使用此列表,因此它必须是整数值的列表。 问题答案:
我遇到了奇怪的问题,我在网上找不到任何东西。 我使用xpath定位我的xml块,然后用其他内容替换它,例如: 我使用XMLModifier来实际更新令牌(使用updateToken方法:),它用于属性操作或元素的文本(正文)。 我对样式元素有问题,我想处理它的主体,然后用指向某个文件的链接替换整个元素。 显然,更新文本标记将导致样式标记和其中的链接标记。 所以我试着把导航器移到样式元素,得到了这个