如何区分具有相同名称的不同 XML 属性?

How to distinguish between different XML properties with same name?

假设我们有以下 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是最高级别)可以在之前找到当前级别 ?

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

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

文档声称符合 http://maven.apache.org/xsd/maven-4.0.0.xsd 中的架构,因此要找出名为 artifactId 的元素的含义,您需要查看该架构。 XML 解析器本身会忽略模式,但如果您执行模式验证(可以在 XML 解析过程中完成,或单独完成),那么模式验证器将考虑由模式,例如,它可能会说一个元素的内容是对另一个元素名称的引用。

然而,在这种情况下,架构将 artefactId 简单地定义为字符串。因此,此字符串的含义仅取决于处理 XML 的应用程序,并考虑 XML 的发件人和收件人之间就如何使用该字段达成的任何显式或隐式协议.