如何区分同名的不同XML属性?

如何区分同名的不同XML属性?,xml,parsing,properties,xml-parsing,Xml,Parsing,Properties,Xml Parsing,假设我们有以下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://mave

假设我们有以下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>

4.0.0
项目名称
1.0-快照
1.8
pl.project13.maven
git提交id插件
2.2.4
获取git信息
修订
${project.basedir}/.git
吉特
假的
真的
${project.build.outputDirectory}/${artifactId}\u git.properties
json
我看到下面一行中对
artifactId
的引用,解析为ProjectName(文件中的第一个artifactId),而不是git commit id plugin(文件中的第二个artifactId)

${project.build.outputDirectory}/${artifactId}\u git.properties


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

XML解析器。。。好。。。解析。它与xml内容的解释无关。这取决于xml的使用者(需要xml的程序的作者)如何使用字符串,如
“${project.build.outputDirectory}/${artifactId}\u git.properties”
。这只是一根线。XML解析器对其含义没有概念。至于消费者,就目前而言,他可以用他喜欢的任何东西来取代
artifactId
。它可能是
project.artifactId
。它可能是
project.build.plugins.plugin.artifactId
。或者它甚至可能像一首诗一样奇怪。所以在阅读特定xml配置文件的文档之前,您永远不会知道


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

XML解析器。。。好。。。解析。它与xml内容的解释无关。这取决于xml的使用者(需要xml的程序的作者)如何使用字符串,如
“${project.build.outputDirectory}/${artifactId}\u git.properties”
。这只是一根线。XML解析器对其含义没有概念。至于消费者,就目前而言,他可以用他喜欢的任何东西来取代
artifactId
。它可能是
project.artifactId
。它可能是
project.build.plugins.plugin.artifactId
。或者它甚至可能像一首诗一样奇怪。所以在阅读特定xml配置文件的文档之前,您永远不会知道


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

文档声明与上的模式一致,因此要找出名为artifactId的元素的含义,您需要查看该模式。XML解析器本身会忽略模式,但如果执行模式验证(可以在XML解析过程中执行,也可以单独执行),则模式验证器将考虑模式施加的任何约束,例如,可能会说一个元素的内容是对另一个元素名称的引用


然而,在本例中,模式仅将artefactId定义为字符串。因此,该字符串的含义完全取决于处理XML的应用程序,考虑到XML的发送者和接收者之间就如何使用该字段达成的任何明示或暗示协议。

文档声明符合,因此,要找出名为artifactId的元素的含义,您需要查看该模式。XML解析器本身会忽略模式,但如果执行模式验证(可以在XML解析过程中执行,也可以单独执行),则模式验证器将考虑模式施加的任何约束,例如,可能会说一个元素的内容是对另一个元素名称的引用


然而,在本例中,模式仅将artefactId定义为字符串。因此,此字符串的含义完全取决于处理XML的应用程序,考虑到XML的发送者和接收者之间就如何使用字段达成的任何显式或隐式协议。

一些库使用节点来管理此字段。XML解析器不会解析数据的树结构。用户必须确保属性的路径是唯一的。当发生重复时,您必须分段解析到唯一节点以获取任何特定子节点。某些库使用节点管理此操作。XML解析器不会解析数据的树结构。用户必须确保属性的路径是唯一的。当发生重复时,您必须分段解析到唯一节点以获取任何特定子节点。