首页 > 解决方案 > 如何区分具有相同名称的不同 XML 属性?

问题描述

假设我们有以下 XML 结构:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>ProjectName</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>pl.project13.maven</groupId>
                <artifactId>git-commit-id-plugin</artifactId>
                <version>2.2.4</version>
                <executions>
                    <execution>
                        <id>get-the-git-infos</id>
                        <goals>
                            <goal>revision</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <dotGitDirectory>${project.basedir}/.git</dotGitDirectory>
                    <prefix>git</prefix>
                    <verbose>false</verbose>
                    <generateGitPropertiesFile>true</generateGitPropertiesFile>
                    <generateGitPropertiesFilename>${project.build.outputDirectory}/${artifactId}_git.properties</generateGitPropertiesFilename>
                    <format>json</format>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

artifactId在下一行看到该引用,解析为ProjectName(文件中的第一个 artifactId)而不是git-commit-id-plugin(文件中的第二个 artifactId)。

<generateGitPropertiesFilename>${project.build.outputDirectory}/${artifactId}_git.properties</generateGitPropertiesFilename>

XML 解析器如何解析对多次存在(在不同级别)的属性的引用?它是否解析为在当前级别之前可以找到的最高级别的同名属性(假设 root 是最高级别) ?

标签: xmlparsingpropertiesxml-parsing

解决方案


一个 XML 解析器……嗯……解析。它与 xml 内容的解释无关。由 xml 的使用者(需要该 xml 的程序的作者)决定如何使用"${project.build.outputDirectory}/${artifactId}_git.properties". 那只是一个字符串。XML 解析器不知道它的含义。而对于消费者而言,他可以artifactId用任何他喜欢的东西来代替。可能是project.artifactId。可能是project.build.plugins.plugin.artifactId。或者它甚至可能像一首诗一样奇怪。所以...在您阅读该特定 xml 配置文件的文档之前,您永远不会知道。

PS。然后......有XSLT。但这是一个不同的故事。然而,同样的输出——在您阅读 XSLT 代码或一些文档之前,您永远不知道结果会是什么。


推荐阅读