【问题标题】:Ant and XML configuration file parsingAnt 和 XML 配置文件解析
【发布时间】:2010-11-30 22:59:51
【问题描述】:

我有一个如下形式的 XML 文件 -

<map MAP_XML_VERSION="1.0">
    <entry key="database.user" value="user1"/>
    ...
</map>

ant 是否具有读取此内容并让我执行 xquery 以拉回键值的本机能力?通过 API 我没有看到这样的功能。

【问题讨论】:

    标签: java xml ant


    【解决方案1】:

    可选的 Ant 任务 XMLTask 就是为此而设计的。给它一个 XPath 表达式,您可以将上面的内容选择到(比如说)一个属性中。 Here's an article 如何使用它,并附有示例。它还将执行大量其他与 XML 相关的操作/查询/创建。

    例如

    <xmltask source="map.xml">
       <!-- copies to a property 'user' -->
       <copy path="/map/entry[@key='database.user']/@value" attrValue="true" property="user"/>
    </xmltask>
    

    免责声明:我是作者。

    【讨论】:

      【解决方案2】:

      您可以使用scriptdef 标记为您的类创建一个JavaScript 包装器。在 JS 中,您几乎拥有 Java 的全部功能,并且可以进行任何类型的复杂 XML 解析。

      例如:

      <project default="build">        
          <target name="build">            
              <xpath-query query="//entry[@key='database.user']/@value"
                           xmlFile="test.xml" addproperty="value"/>
              <echo message="Value is ${value}"/>    
          </target>
      
          <scriptdef name="xpath-query" language="javascript">
              <attribute name="query"/>
              <attribute name="xmlfile"/>
              <attribute name="addproperty"/>
      
              <![CDATA[
                  importClass(java.io.FileInputStream);
                  importClass(javax.xml.xpath.XPath);
                  importClass(javax.xml.xpath.XPathConstants);
                  importClass(javax.xml.xpath.XPathFactory);
                  importClass(org.xml.sax.InputSource);
      
                  var exp = attributes.get("query");
                  var filename = attributes.get("xmlfile");
                  var input = new InputSource(new FileInputStream(filename));
                  var xpath = XPathFactory.newInstance().newXPath();
                  var value = xpath.evaluate(exp, input, XPathConstants.STRING);
      
                  self.project.setProperty( attributes.get("addproperty"), value );
      
              ]]>
      
          </scriptdef>
      </project>
      

      【讨论】:

      • 到目前为止,我绝对喜欢这种方法,但我遇到了一个问题。在评估调用它挂起 30-40 秒,我得到一个 javax.script.ScriptException 包装一个 javax.xml.xpath.XPathExpressionException。即使我简化查询以选择整个文档,我也会得到这个。有什么想法吗?
      • 我必须查看您正在使用的 XML 和 xpath 查询。上面的示例仅用于选择文本元素。您可能正在尝试选择一个节点或节点集。
      • 它应该返回元素“entry”的属性“value”的值。 xpath 查询与您在此处的示例中输入的内容相同。我唯一没有提到的是文档类型(ttp://java.sun.com/dtd/preferences.dtd%22>" rel="nofollow" target="_blank">java.sun.com/dtd/preferences.dtd">) 和顶部的标准 xml 标头。
      • 我敢打赌它正在尝试通过网络解析preferences.dtd。
      • 向你致敬,Brian,这正是问题所在。问题已解决。
      【解决方案3】:

      听起来你想要ant-xpath-task 之类的东西。我不知道使用 Ant 执行此操作的内置方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-05
        • 2011-10-29
        • 2021-06-16
        • 2021-08-14
        相关资源
        最近更新 更多