【问题标题】:Extract tags from xml document从xml文档中提取标签
【发布时间】:2016-12-26 16:47:32
【问题描述】:

我正在尝试使用JAVAXML 文档中提取一些标签,我看到了一些与DOM 相关的答案,但我不需要标签的值,下面是我拥有的XML提取<MsgHeader>标签

    <MFEP>
    <MsgHeader>
        <TmStp>2013-12-25T10:52:50</TmStp>
        <TrsInf>
            <SdrCode>145</SdrCode>
            <RcvCode>7777</RcvCode>
            <ReqTyp>asd</ReqTyp>
        </TrsInf>
    </MsgHeader>

    <MsgHeader>
        <TmStp>2013-12-25T10:52:50</TmStp>
        <TrsInf>
            <SdrCode>2123</SdrCode>
            <RcvCode>323</RcvCode>
            <ReqTyp>asd</ReqTyp>
        </TrsInf>
    </MsgHeader>

    <MsgBody>
        <AcctInfo>
            <BillingNo>asd</BillingNo>
            <BillNo>1267</BillNo>
        </AcctInfo>
        <ServiceType>FixedLine</ServiceType>
    </MsgBody>
    <MsgFooter>
        <Security>
            <Signature>asd</Signature>
        </Security>
    </MsgFooter>

    <MsgHeader>
        <TmStp>2013-12-25T10:52:50</TmStp>
        <TrsInf>
            <SdrCode>2</SdrCode>
            <RcvCode>3</RcvCode>
            <ReqTyp>BILPULRQ</ReqTyp>
        </TrsInf>
    </MsgHeader>
</MFEP>

而且输出必须是

    <MsgHeader>
        <TmStp>2013-12-25T10:52:50</TmStp>
        <TrsInf>
            <SdrCode>145</SdrCode>
            <RcvCode>7777</RcvCode>
            <ReqTyp>asd</ReqTyp>
        </TrsInf>
    </MsgHeader>

    <MsgHeader>
        <TmStp>2013-12-25T10:52:50</TmStp>
        <TrsInf>
            <SdrCode>2123</SdrCode>
            <RcvCode>323</RcvCode>
            <ReqTyp>asd</ReqTyp>
        </TrsInf>
    </MsgHeader>

    <MsgHeader>
        <TmStp>2013-12-25T10:52:50</TmStp>
        <TrsInf>
            <SdrCode>2</SdrCode>
            <RcvCode>3</RcvCode>
            <ReqTyp>BILPULRQ</ReqTyp>
        </TrsInf>
    </MsgHeader>

【问题讨论】:

  • 使用 xslt 很容易
  • 我以前很少使用 XSLT,但遗憾的是没有时间学习更多,如果有其他想法会更好
  • 好吧,如果您向我们展示您选择元素节点的 Java 代码,那么我们可以添加一些代码来序列化它们,通常查看docs.oracle.com/javase/7/docs/api/org/w3c/dom/ls/… 以将节点序列化为 XML。或者使用默认的 Transformer。
  • 另请参阅docs.oracle.com/javase/tutorial/jaxp/xslt/writingDom.html,了解如何将 DOM 节点写为 XML。
  • 您忘记向我们展示您的代码。你应该解释你有什么具体问题。

标签: java xml dom


【解决方案1】:

我知道你不愿意乱搞 XSLT,但它就是这么简单:

transform.xslt

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <MFEP>
      <xsl:apply-templates select="/MFEP/MsgHeader"/>
    </MFEP>
  </xsl:template>

  <xsl:template match="/MFEP/MsgHeader">
    <xsl:copy-of select="." />
  </xsl:template>

</xsl:stylesheet>

Java 代码:

TransformerFactory factory = TransformerFactory.newInstance();
Source xslt = new StreamSource(new File("transform.xslt"));
Transformer transformer = factory.newTransformer(xslt);

Source text = new StreamSource(new File("input.xml"));
transformer.transform(text, new StreamResult(new File("output.xml")));

【讨论】:

  • 完美它可以工作,但如果我需要它动态意味着它并不总是必须是 /MFEP/MsgHeader 它可能是其他标签,所以如果我可以通过标签来自java代码?
  • 通常直接在 xslt 文件上更改它更容易/更快,因为您不需要重新编译并将其打包到 jar/war 文件中。如果您必须涵盖许多 XML 结构,您可以为每个结构编写一个 xslt,并将 xslt 文件路径作为 Java 参数传递。如果还不够,您可以将参数传递给 xslt 文件 (transformer.setParameter()) ,甚至可以通过编程方式生成 xslt 文件,因为它本身就是一个 XML 文件。但我认为你应该首先考虑更简单的选择。
  • 明天我试试,+1 谢谢
猜你喜欢
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
相关资源
最近更新 更多