Maven replacer插件中的XPath问题

时间:2013-09-03 20:01:48

标签: maven xpath

尝试使用XPath在web.xml中替换Maven替换器插件时出现以下错误

[ERROR] Failed to execute goal com.google.code.maven-replacer-plugin:replacer:1.5.2:replace (default) on project my-project: 
Error during XML replacement: Content is not allowed in prolog. -> [Help 1]

这是Maven代码

<plugin>
    <groupId>com.google.code.maven-replacer-plugin</groupId>
    <artifactId>replacer</artifactId> 
    <version>1.5.2</version> 
    <executions>
        <execution>
            <phase>prepare-package</phase> <goals>
                <goal>replace</goal> 
            </goals> 
        </execution> 
    </executions> 
    <configuration>
        <file>src/main/webapp/WEB-INF/web.xml</file>
        <outputFile>target/web.xml</outputFile> 
        <regexFlags>
            <regexFlag>CASE_INSENSITIVE</regexFlag> 
        </regexFlags> 
<replacements> 
    <replacement>
        <xpath>/web-app/display-name</xpath>
        <token>.*</token> 
        <value>${project.name}</value> 
    </replacement> 
</replacements>
</plugin>

的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
     id="my-project"
     version="2.5">

    <display-name>My Project</display-name>
    ...
</web-app>

知道为什么吗?

3 个答案:

答案 0 :(得分:1)

您需要注册“http://java.sun.com/xml/ns/javaee”命名空间,并选择一个前缀,例如“javaee”,然后使用/javaee:web-app/javaee:display-name作为您的XPath表达式。

根据此link,您可以在插件的<configuration>部分执行此操作:

<plugin>
    ...

    <configuration>
        <namespaceContexts>
            <javaee>http://java.sun.com/xml/ns/javaee</javaee>
        </namespac‌​eContexts>
        ...

答案 1 :(得分:0)

“prolog中不允许的内容”或者意味着XML解析器在根元素的开始标记之前找到了除空格字符,注释或处理指令之外的其他内容,或者在<?xml之前有字符(XML)声明必须是文件中的第一个东西,在它之前不允许空格。)

检查XML文件在开始时没有字节顺序标记 - 某些编辑器(特别是Windows记事本)习惯在UTF-8文本文件中添加一个,我知道这会导致某些版本的XML解析器Java的窒息。

答案 2 :(得分:0)

选择要完全替换的文本节点

<replacement>
    <xpath>/web-app/display-name/text()</xpath>
    <token>^.*$</token> 
    <value>${project.name}</value> 
</replacement>

当使用选择节点的xpath时,replacer插件执行以下操作:

  1. 选择节点(<display-name>My Project</display-name>
  2. 将整个节点转换为字符串("<?xml version="1.0" encoding="UTF-8"?><display-name>My Project</display-name>"
  3. 替换该字符串中的标记(.*)(字符串现在是"${project.name}" - 不再有xml标记)
  4. 将替换后的String解析回XML节点:由于您的String不是有效的XML(因为您完全替换了它),这会中断。)
  5. 解决此问题的最简单方法是选择节点的文本节点。

    奖励:在这种情况下,如果您的令牌为.*,它将匹配两次(我不确定原因),因此请务必使用^.*$