Java 如何从这个XML文档中获取祖先节点?

Java 如何从这个XML文档中获取祖先节点?,java,xml,xpath,Java,Xml,Xpath,我有一个xml文档,比如说格式: <DynamicReport> <DynamicReportDefId>501</DynamicReportDefId> <DynamicReportDefName>Test report</DynamicReportDefName> <DynamicReportDefSource>Live</DynamicReportDefSource> <

我有一个xml文档,比如说格式:

<DynamicReport>
    <DynamicReportDefId>501</DynamicReportDefId>
    <DynamicReportDefName>Test report</DynamicReportDefName>
    <DynamicReportDefSource>Live</DynamicReportDefSource>
    <IsPrivate>false</IsPrivate>
    <showSummaryRowsOnly>false</showSummaryRowsOnly>
    <Limit>false</Limit>
    <LimitRows/>
    <InvUserId/>
    <Version>0</Version>
    <Category/>
    <Columns class="array">
        <Column>
            <TableName>vwdynfirms</TableName>
            <ColumnName>firmlongname</ColumnName>
            <FormattingInfo>
                <Header>
                    <DisplayName>Firm Long Name</DisplayName>
                    <FontInfo>
                        <Font/>
                        <FontSize/>
                        <IsBold/>
                        <IsItalic/>
                        <IsUnderline/>
                        <TextColor/>
                        <BackgroundColor/>
                    </FontInfo>
                    <AlignmentInfo>
                        <HorizontalAlignment/>
                        <VerticalAlignment/>
                    </AlignmentInfo>
                    <BorderInfo>
                        <BorderLeft/>
                        <BorderRight/>
                        <BorderTop/>
                        <BorderBottom/>
                    </BorderInfo>
                </Header>
                <Detail>
                    <FontInfo>
                        <Font/>
                        <FontSize/>
                        <IsBold/>
                        <IsItalic/>
                        <IsUnderline/>
                        <TextColor/>
                        <BackgroundColor/>
                    </FontInfo>
                    <AlignmentInfo>
                        <HorizontalAlignment/>
                        <VerticalAlignment/>
                    </AlignmentInfo>
                    <BorderInfo>
                        <BorderLeft/>
                        <BorderRight/>
                        <BorderTop/>
                        <BorderBottom/>
                    </BorderInfo>
                    <DisplayPattern/>
                </Detail>
            </FormattingInfo>
        </Column>
        <Column>
            <TableName>vwdynfirms</TableName>
            <ColumnName>firmname</ColumnName>
            <FormattingInfo>
                <Header>
                    <DisplayName>Firm Name</DisplayName>
                    <FontInfo>
                        <Font>Calibri</Font>
                        <FontSize>14</FontSize>
                        <IsBold>true</IsBold>
                        <IsItalic/>
                        <IsUnderline/>
                        <TextColor>#FF0080</TextColor>
                        <BackgroundColor>#FFFFFF</BackgroundColor>
                    </FontInfo>
                    <AlignmentInfo>
                        <HorizontalAlignment>left</HorizontalAlignment>
                        <VerticalAlignment>bottom</VerticalAlignment>
                    </AlignmentInfo>
                    <BorderInfo>
                        <BorderLeft/>
                        <BorderRight/>
                        <BorderTop/>
                        <BorderBottom>true</BorderBottom>
                    </BorderInfo>
                </Header>
                <Detail>
                    <FontInfo>
                        <Font/>
                        <FontSize/>
                        <IsBold/>
                        <IsItalic/>
                        <IsUnderline/>
                        <TextColor/>
                        <BackgroundColor/>
                    </FontInfo>
                    <AlignmentInfo>
                        <HorizontalAlignment/>
                        <VerticalAlignment/>
                    </AlignmentInfo>
                    <BorderInfo>
                        <BorderLeft/>
                        <BorderRight/>
                        <BorderTop/>
                        <BorderBottom/>
                    </BorderInfo>
                    <DisplayPattern/>
                </Detail>
            </FormattingInfo>
        </Column>
    </Columns>
</DynamicReport>

我能够得到文本颜色和背景色。但是我不知道如何往回遍历并获得相应的列名并将其添加到地图中。任何帮助都将不胜感激。提前谢谢。

如果你不介意的话:)

我能够得到文本颜色和背景色。但我没有 关于如何返回并获取相应列的线索 命名并将其添加到地图中

只需计算此XPath表达式即可(使用您在其中找到的当前上下文节点:
/DynamicReport/Columns/Column/FormattingInfo/Header/FontInfo
):


虽然这不是您所要求的,但我认为您最好使用XPath来定位每个
元素,然后重用
XPath
实例来定位与其相关的数据:

public static Map<String, List<String>> getColors(Document doc) {
    XPath xpath = XPathFactory.newInstance().newXPath();
    try {
        NodeList columns = (NodeList)
            xpath.evaluate("/DynamicReport/Columns/Column", doc,
                XPathConstants.NODESET);

        int numColumns = columns.getLength();
        Map<String, List<String>> map = new LinkedHashMap<>(numColumns);

        for (int i = 0; i < numColumns; i++) {
            Node column = columns.item(i);

            String columnName = xpath.evaluate("ColumnName", column);

            Node fontInfo = (Node) xpath.evaluate(
                "FormattingInfo/Header/FontInfo", column,
                    XPathConstants.NODE);

            String textColor =
                xpath.evaluate("TextColor", fontInfo);
            String backgroundColor =
                xpath.evaluate("BackgroundColor", fontInfo);

            map.put(columnName, Arrays.asList(textColor, backgroundColor));
        }

        return map;
    } catch (XPathException e) {
        throw new RuntimeException(e);
    }
}
publicstaticmap-getColors(文档文档){
XPath=XPathFactory.newInstance().newXPath();
试一试{
节点列表列=(节点列表)
xpath.evaluate(“/DynamicReport/Columns/Column”,doc,
XPathConstants.NODESET);
int numColumns=columns.getLength();
Map Map=newlinkedhashmap(numColumns);
对于(int i=0;i

如果未将XPathConstants常量传递给XPath.evaluate,则会返回匹配节点的文本内容,这正是获取字符串所需的内容。

是否考虑过制作文档扫描仪、加载xml并创建数据模型?XPath非常适合查询xml以在文档中找到一个位置,但对于您要完成的任务来说,它可能不是最好的工具。虽然我相信有些人会不同意,希望他们能给你一个快速的答案:)你必须寻找ColumnName作为父元素吗?我认为将多个简短的XPath表达式传递给同一个
XPath
实例会更简洁。如果将来通过添加或删除上下文节点的祖先来更改文档层次结构,则此代码将停止生成正确的结果。另一方面,评估这个XPath表达式不会受到影响:
祖先::列[1]/ColumnName
。我不会投反对票,我只是在评论:)同意:)我不建议对它进行切分,但如果它是时间敏感的,请释放切达,等待XSL人员进来说“哇!”谢谢,它成功了。我不知道xPath.evaluate()函数会立即给我值。谢谢。
Element column = (Element)(eElement.getParentNode().getParentNode().getParentNode());
ancestor::Column[1]/ColumnName
public static Map<String, List<String>> getColors(Document doc) {
    XPath xpath = XPathFactory.newInstance().newXPath();
    try {
        NodeList columns = (NodeList)
            xpath.evaluate("/DynamicReport/Columns/Column", doc,
                XPathConstants.NODESET);

        int numColumns = columns.getLength();
        Map<String, List<String>> map = new LinkedHashMap<>(numColumns);

        for (int i = 0; i < numColumns; i++) {
            Node column = columns.item(i);

            String columnName = xpath.evaluate("ColumnName", column);

            Node fontInfo = (Node) xpath.evaluate(
                "FormattingInfo/Header/FontInfo", column,
                    XPathConstants.NODE);

            String textColor =
                xpath.evaluate("TextColor", fontInfo);
            String backgroundColor =
                xpath.evaluate("BackgroundColor", fontInfo);

            map.put(columnName, Arrays.asList(textColor, backgroundColor));
        }

        return map;
    } catch (XPathException e) {
        throw new RuntimeException(e);
    }
}