Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven replacer插件中的XPath问题_Maven_Xpath - Fatal编程技术网

Maven replacer插件中的XPath问题

Maven replacer插件中的XPath问题,maven,xpath,Maven,Xpath,在尝试使用XPath替换web.xml中的Maven replacer插件时,出现以下错误 [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]

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

[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>

com.google.code.maven-replacer-plugin
替代者
1.5.2 
准备包装
代替
src/main/webapp/WEB-INF/WEB.xml
target/web.xml
不区分大小写
/web应用程序/显示名称
.* 
${project.name}
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>

我的项目
...
知道为什么吗?

“prolog中不允许的内容”要么意味着XML解析器在根元素的开始标记之前发现了除空白字符、注释或处理指令以外的内容,要么意味着在
之前有字符,您需要注册“”命名空间,并选择前缀,比如“javaee”,然后使用
/javaee:web app/javaee:display name
作为XPath表达式

根据这一点,您可以在插件的
部分执行此操作:

<plugin>
    ...

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

...
http://java.sun.com/xml/ns/javaee
...
选择要完全替换的文本节点:

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

/web应用程序/显示名称/文本()
^.*$ 
${project.name}
使用选择节点的XPath时,replacer插件执行以下操作:

  • 选择节点(
    我的项目
  • 将整个节点转换为字符串(
    “我的项目”
  • 替换该字符串中的标记(
    *
    )(字符串现在是
    “${project.name}”
    -不再有xml标记)
  • 将替换的字符串解析回XML节点:这会中断,因为您的字符串不是有效的XML(因为您完全替换了它)
  • 解决此问题的最简单方法是选择节点的文本节点


    奖励:在这种情况下,如果您的令牌是
    *
    ,它将匹配两次(我不知道为什么),因此请确保使用
    ^.*$

    可能是“”命名空间。显然,根据,您需要添加
    http://java.sun.com/xml/ns/javaee
    在插件的
    中,然后可以使用
    /javaee:web app/javaee:display name
    是的,就是这样。请添加您的评论作为答案,以便我可以投票并接受。谢谢。通常情况是这样,但这里的根本原因是不同的。