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