gpt4 book ai didi

java - 需要帮助从 xml 递归获取数据

转载 作者:行者123 更新时间:2023-12-02 12:53:01 26 4
gpt4 key购买 nike

我正在尝试通过 XSLT 递归地从以下 xml 属性中读取数据。

这是我的示例 XML 数据!!

<FIXML .....">
<Batch ....>
<MktDef MktID="XEUR" MktSegID="14" EfctvBizDt="2017-05-11" NxtEfctvBizDt="2017-05-15" MktSeg="CONF" MarketSegmentDesc="FUT 8-13 Y. SWISS GOV.BONDS 6%" Sym="CH0002741988" ParentMktSegmID="FBND" Ccy="CHF" MktSegStat="1" USFirmFlag="Y" PartID="2">
.
.
.
</MktDef>
<MktDef MktID="XEUR" MktSegID="19629" EfctvBizDt="2017-05-11" NxtEfctvBizDt="2017-05-15" MktSeg="FBON" MarketSegmentDesc="EURO BONO FUTURE 8,5-10,5 YEAR" Sym="DE000A163W29" ParentMktSegmID="FBND" Ccy="EUR" MktSegStat="1" USFirmFlag="Y" PartID="2">
.
.
.
</MktDef>
.
.
.

这是我的 XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" >
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
MktID,MktSegID,EfctvBizDt,NxtEfctvBizDt,MktSeg,MarketSegmentDesc,Sym,ParentMktSegmID,Ccy,MktSegStat,USFirmFlag,PartID
<xsl:for-each select="/">
<xsl:value-of select="concat(ancestor::FIXML/Batch/MktDef/@MktID,',',ancestor::FIXML/Batch/MktDef/@MktSegID,',',ancestor::FIXML/Batch/MktDef/@EfctvBizDt,',',ancestor::FIXML/Batch/MktDef/@NxtEfctvBizDt,',',ancestor::FIXML/Batch/MktDef/@MktSeg,',',ancestor::FIXML/Batch/MktDef/@MarketSegmentDesc,',',ancestor::FIXML/Batch/MktDef/@Sym,',',ancestor::FIXML/Batch/MktDef/@ParentMktSegmID,',',ancestor::FIXML/Batch/MktDef/@Ccy,',',ancestor::FIXML/Batch/MktDef/@MktSegStat,',',ancestor::FIXML/Batch/MktDef/@USFirmFlagt,',',ancestor::FIXML/Batch/MktDef/@PartID,'&#xA;')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

这是我的 Java 代码..

class Xml2Csv {

public static void main(String args[]) throws Exception {
File stylesheet = new File("style.xsl");
//File xmlSource = new File("Testing-1.xml");
File xmlSource = new File("95FILRDF01PUBLI20170511XEUR6NJ92000.xml");

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(xmlSource);

StreamSource stylesource = new StreamSource(stylesheet);
Transformer transformer = TransformerFactory.newInstance().newTransformer(stylesource);
Source source = new DOMSource(document);
System.out.println(source.toString());
System.out.println("Hello");
Result outputTarget = new StreamResult(new File("MktDef.csv"));
transformer.transform(source, outputTarget);

}
}

我正在解析此 xml 并尝试从 MktDef 属性获取数据并将其存储在 CSV 中,如下所示,

MktID   MktSegID    EfctvBizDt  NxtEfctvBizDt   MktSeg  MarketSegmentDesc   Sym ParentMktSegmID Ccy MktSegStat  USFirmFlag  PartID
XEUR 14 5/11/2017 5/15/2017 CONF FUT 8-13 Y. SWISS GOV.BONDS 6% CH0002741988 FBND CHF 1 2
XEUR 14 5/11/2017 5/15/2017 CONF FUT 8-13 Y. SWISS GOV.BONDS 6% CH0002741988 FBND CHF 1 2
XEUR 14 5/11/2017 5/15/2017 CONF FUT 8-13 Y. SWISS GOV.BONDS 6% CH0002741988 FBND CHF 1 2
XEUR 14 5/11/2017 5/15/2017 CONF FUT 8-13 Y. SWISS GOV.BONDS 6% CH0002741988 FBND CHF 1 2
.
.
.

我现在面临的问题是我一直只获得第一个 MktDef 数据。我了解到 XSLT 中存在一些逻辑问题。

我对 XML 和 XSLT 工作非常陌生,所以请有人帮助我解决这个问题。提前致谢!

最佳答案

当您位于根节点 ( / ) 的模板内部时,for-each 的选择中的 XPath 是相对于该节点的。您想要迭代 MktDef 中的每一个元素,所以它应该是 FIXML/Batch/MktDef .

现在,在 for-each 内部,上下文节点更改为当前的 MkDef每次迭代中的元素。所以,要获取当前的值MktDef元素的属性,您可以从中选择相对值:即 @MktSegID

此外,如果您要发出文字文本(例如 CSV 标题行),请将其放入 <xsl:text> 内元素,以便您可以在模板中使用文本格式和缩进,并且空白不被视为重要。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" >
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>

<xsl:template match="/">
<xsl:text>MktID,MktSegID,EfctvBizDt,NxtEfctvBizDt,MktSeg,MarketSegmentDesc,Sym,ParentMktSegmID,Ccy,MktSegStat,USFirmFlag,PartID&#xA;</xsl:text>

<xsl:for-each select="FIXML/Batch/MktDef">
<xsl:value-of select="concat(@MktID,',',@MktSegID,',',@EfctvBizDt,',',@NxtEfctvBizDt,',',@MktSeg,',',@MarketSegmentDesc,',',@Sym,',',@ParentMktSegmID,',',@Ccy,',',@MktSegStat,',',@USFirmFlagt,',',@PartID,'&#xA;')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

关于java - 需要帮助从 xml 递归获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44534087/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com