坚持使用JDOM Parsing?

时间:2012-05-10 07:46:43

标签: java xml jaxb xml-parsing jdom

我有一个复杂的JDOM元素,如下面的(A),我需要像(B)那样改变结构,以便在JAXB上工作(使用现有的类, 我唯一能做的就是改变xml的结构,我能用JDOM api做到这一点吗?

由于我是java的初学者,对我来说很难,如果有人指出解决方案,那对我来说非常有帮助

现有元素(A)

<DETAILS>
    <ROWSET name="OPTIONS">
       <ROW num="1">
          <Uniqueno>1000</Uniqueno>
          <ROWSET name="SUSPENCE">
             <ROW num="1">
                <Uniqueno>1001</Uniqueno>
                <ROWSET name="PERSONS">
                   <ROW num="1">
                     <Name>60821894</Name>
                     <Age>44</Age>
                   </ROW>
                   <ROW num="2">
                      <Name>60821894</Name>
                      <Age>44</Age>
                   </ROW>
                </ROWSET>
                <ROWSET name="PERSONS">
                   <ROW num="1">
                     <Name>60821894</Name>
                     <Age>55</Age>
                   </ROW>
                   <ROW num="2">
                      <Name>60821894</Name>
                      <Age>55</Age>
                   </ROW>
                   <ROW num="3">
                      <Name>60821894</Name>
                      <Age>55</Age>
                   </ROW>
                </ROWSET>
             </ROW>
          </ROWSET>
       </ROW>
    </ROWSET>
 </DETAILS>

必需元素(B)

<DETAILS>
    <OPTIONS>
          <Uniqueno>1000</Uniqueno>
          <SUSPENCE>
                <Uniqueno>1001</Uniqueno>
                <PERSONS>
                     <Name>60821894</Name>
                     <Age>44</Age>
                     <Name>60821894</Name>
                     <Age>44</Age>
                </PERSONS>
                <PERSONS>
                     <Name>60821894</Name>
                     <Age>55</Age>
                     <Name>60821894</Name>
                     <Age>55</Age>
                     <Name>60821894</Name>
                     <Age>55</Age>
                </PERSONS>
          </SUSPENCE>
    </OPTIONS>
 </DETAILS>

3 个答案:

答案 0 :(得分:2)

我建议改用XSLT。更容易。从这样的事情开始

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="DETAILS/ROWSET[@name='OPTIONS']">
    <DETAILS>
        <OPTIONS>
            <xsl:apply-templates />
        </OPTIONS>
    </DETAILS>
</xsl:template>

<xsl:template match="ROW">
        <xsl:apply-templates />
</xsl:template>

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

查看xmls,这是两个完全不同的xmls。你需要构建一个类似于B dyanamically的xml结构。为此,以下链接将帮助你。

http://www.ibm.com/developerworks/java/library/j-jdom/

希望这会对你有所帮助。

答案 2 :(得分:1)

你多次问过基本相同的问题。

Remove XML attribute using JDOM API?

Issues in Parsing XML

如果您还没有能够正确地解决上一个问题,那么在进行多元素移动之前,您需要退后一步并使用更多基本示例。

虽然我同意四十二,从长远来看,XSL将是一个更好的解决方案,但我认为你不在一个可以让事情变得更容易的地方(适合你)。如果您的数据可以使用JDOM元素,则应该找出Java调试器,并在添加和删除元素时检查元素。您需要“玩”一点来更好地理解Java,XML和JDOM的工作方式。现在你要问的是一大堆相关的问题,这些问题显示了对“基础”概念的基本误解。在解决这些更复杂的概念之前,你需要掌握这些基础。

你从简单的事情开始:

XMLOutputter xout = new XMLOutputter(Format.getPrettyFormat());
Document doc = new Document();
Element root = new Element("DETAILS");
doc.addContent(root);

xout.output(System.out, doc);

Element row = new Element("ROW");
root.addContent(row);

xout.output(System.out, doc);

row.detach();
xout.output(System.out, doc);

您可以使用上述内容来查看内容的添加方式,以及与JDOM内容的分离。

然后,当您想到这一点时,可以将其放入循环,扫描等中,以便您可以分离,并从文档层次结构中的其他位置重新添加内容。