【问题标题】:Results of loop for XPath query run twice?XPath 查询的循环结果运行两次?
【发布时间】:2012-08-26 11:52:38
【问题描述】:

我想打印一个 XPath 表达式的组结果,该表达式将查询与 |操作员。 (可以,但是有问题)

我的 XPath 表达式是:

//y-axis-title/text() | /bar-chart/bars/bar[@number='4']/value/text() |//bar[@number='5']/value/text()

我的代码:

public void loadData() {
            dl.loadDocuments("input\\bars.xml");
            try {
                XPath yAxisTitle = XPath.newInstance("//y-axis-title/text() | /bar-chart/bars/bar[@number='4']/value/text() | //bar[@number='5']/value/text()");
                List<Text> elements = (List<Text>)yAxisTitle.selectNodes(dl.getInputDocument());
                for(int i=0; i<elements.size(); i++){
                    System.out.println(elements.get(i).getText());
                }
            } catch (JDOMException jde){
                System.out.println("JDOMException at Exercise1.loadData(): "+ jde.getMessage());
            }
        }

问题是它打印出这个:

长度 140 120 长度 140 120

虽然它只应该打印出来(我的预期结果):

长度 140 120

某处必须执行我的循环两次。我不知道那是什么。这对我来说没有意义,因为该分组表达式中有 3 个结果集,因此计数器为 3。我在调试时检查了这个。这个“2”(即运行两次)来自哪里?

我该如何解决这个问题才能获得预期的结果?

谢谢。

编辑:示例 bars.xml

<?xml version="1.0"?> 
<bar-chart> 
  <title>Bar Chart: Lengths</title> 
  <x-axis-title>Items</x-axis-title> 
  <y-axis-title>Length</y-axis-title> 
  <value>25</value> 
  <bars>
    <bar number="1">
      <value>90</value>
    </bar> 
  </bars> 
</bar-chart>

【问题讨论】:

  • 能否请您发布一个bars.xml 的缩略样本?
  • ` 条形图:长度 项目长度2590条形> `
  • 您能在方法的开头和结尾处System.out.println 吗?这将告诉您它是否是您向我们展示的代码中的问题,是否与 XPath 有任何关系,或者您的方法是否被其他代码调用了两次。
  • 无法重现:在提供的 XML 文档上评估提供的 XPath 表达式时,仅选择了一个文本节点(“长度”)。请编辑问题并提供与您报告的结果不矛盾的 XML 文档和 XPath 表达式。

标签: java xml loops xpath repeat


【解决方案1】:

感谢 O. R. Mapper,解决了我的问题。

修复
从 Exercise1 类的 constructor 中删除 loadData()(与 loadData() 内容所在的类相同,如我的问题所示)。

问题是 loadData() 已经在其他地方被调用了:
在我的 Controller 类的 constructor 中:

public SimpleXPathController(ISimpleXPath doc){
    model = doc;
    model.loadData();
}

以及在练习 1 类的 构造函数 中:

public Exercise1(){
    dl = new DocumentLoader();
    loadData();
}

最后,在我的 UI 课程中,我接到了这个电话:

SimpleXPathController simpleXPathController = new SimpleXPathController(new Exercise1());

导致:
1) 控制器调用 loadData()
2)Exercise1 实例调用 loadData()

我通过以下方式解决了问题:

System.out.println("testing1");在 try{} 块的开头

System.out.println("testing2") 在 try{} 块的末尾。

问题解决了。

【讨论】:

    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多