# XML Einlesen mit JaxB



## delphiking1980 (6. Mrz 2012)

Hallo,

ich habe schon sehr gute erfahrung mit JaxB gemacht, habe meine Objekte nach XML Transportiert und wieder zurück aber nun habe ich eine XML Datei welche ich erst zu einem Objekt machen muss.

Das XML sieht folgendermaßen aus 

[XML]
<?xml version="1.0" encoding="UTF-8"?>

<BugCollection version="1.2.0" sequence="0" timestamp="1331021748468" analysisTimestamp="1331021753000" release="">
  <Project filename="&lt;&lt;unnamed project&gt;&gt;" projectName="Test">
    <Jar>D:\03_Workspace\ScreenTest\bin</Jar>
    <SrcDir>D:\03_Workspace\ScreenTest\src</SrcDir>
  </Project>
  <BugInstance type="SE_BAD_FIELD" priority="2" abbrev="Se" category="BAD_PRACTICE">
    <Class classname="MyScreen">
      <SourceLine classname="MyScreen" sourcefile="MyScreen.java" sourcepath="MyScreen.java"/>
    </Class>
    <Field classname="MyScreen" name="ge" signature="Ljava/awt/GraphicsEnvironment;" isStatic="false">
      <SourceLine classname="MyScreen" sourcefile="MyScreen.java" sourcepath="MyScreen.java"/>
    </Field>
  </BugInstance>
  <BugInstance type="UPM_UNCALLED_PRIVATE_METHOD" priority="3" abbrev="UPM" category="PERFORMANCE">
    <Class classname="MyScreen">
      <SourceLine classname="MyScreen" sourcefile="MyScreen.java" sourcepath="MyScreen.java"/>
    </Class>
    <Method classname="MyScreen" name="centerDialog" signature="(Ljavax/swing/JDialogV" isStatic="false">
      <SourceLine classname="MyScreen" start="72" end="72" startBytecode="0" endBytecode="51" sourcefile="MyScreen.java" sourcepath="MyScreen.java"/>
    </Method>
  </BugInstance>
  <BugInstance type="UPM_UNCALLED_PRIVATE_METHOD" priority="3" abbrev="UPM" category="PERFORMANCE">
    <Class classname="MyScreen">
      <SourceLine classname="MyScreen" sourcefile="MyScreen.java" sourcepath="MyScreen.java"/>
    </Class>
    <Method classname="MyScreen" name="getScreenCount" signature="()I" isStatic="false">
      <SourceLine classname="MyScreen" start="97" end="97" startBytecode="0" endBytecode="51" sourcefile="MyScreen.java" sourcepath="MyScreen.java"/>
    </Method>
  </BugInstance>
  <BugInstance type="UPM_UNCALLED_PRIVATE_METHOD" priority="3" abbrev="UPM" category="PERFORMANCE">
    <Class classname="MyScreen">
      <SourceLine classname="MyScreen" sourcefile="MyScreen.java" sourcepath="MyScreen.java"/>
    </Class>
    <Method classname="MyScreen" name="isFrameOnDefaultScreen" signature="()Z" isStatic="false">
      <SourceLine classname="MyScreen" start="91" end="91" startBytecode="0" endBytecode="51" sourcefile="MyScreen.java" sourcepath="MyScreen.java"/>
    </Method>
  </BugInstance>
  <Errors></Errors>
  <FindBugsSummary timestamp="Tue, 6 Mar 2012 09:15:48 +0100" total_classes="1" total_bugs="4" total_size="15" num_packages="1" cpu_seconds="5.12" clock_seconds="5.24" peak_mbytes="33.90" gc_seconds="1.27" priority_3="3" priority_2="1">
    <PackageStats package="" total_bugs="4" total_types="1" total_size="15" priority_3="3" priority_2="1">
      <ClassStats class="MyScreen" interface="false" size="15" bugs="4" priority_3="3" priority_2="1"/>
    </PackageStats>
  </FindBugsSummary>
  <ClassFeatures></ClassFeatures>
  <History></History>
</BugCollection>
[/XML]

nur leider weiß ich nicht wie ich die Passagen zwischen den < und > in Variablen einlese da diese ja dem Knoten angehören.....

Ich hoffe es war verständlich was ich bezwecken möchte.


----------



## fastjack (6. Mrz 2012)

Schreib Dir eine DTD oder ein Schema dafür und lasse JAXB die Klassen generieren. Danach kannst Du das XML ganz normal einlesen und speichern.


----------



## delphiking1980 (6. Mrz 2012)

genau das wollte ich ja nicht machen, andere für sich arbeitenlassen ist ja nicht schlecht aber naja


----------



## nillehammer (7. Mrz 2012)

Dann überlege Dir die Objektstruktur selbst. Die Elementnamen könnten Deine Klassennamen sein, die Attributnamen die Namen von Instanzvariablen. Die meisten sind vom Typ String, einige (z.B. das start-Attribut von CodeLine) sind Integers. Einige Elemente enthalten nur SimpleContent, die würde ich als Instanzvariable der übergeordneten Klasse implementieren. Auf den fertigen Code setzt Du noch die entsprechenden Annotations. Nachfolgend mal ein Beispiel für den Einstieg

```
public class BugCollection {

   private Project project;

   private List<BugInstance> bugInstances;

   ... getter und setter...
}

public class Project {

   private String fileName;

   private String projectName;

   private String jar;

   private String srcDir;

   ... getter und setter...
}
```
Mit den Annotationen, die man setzen muss, kennst Du Dich sicher besser aus als ich, wenn du schon mit JAXB erfolgreich gearbeitet hast. Schau Dir notfalls nochmal den Java-Code Deiner JAXB-Projekte an.


----------



## BOBOHelp (11. Mrz 2012)

Das muss passen, danach xjc fertig:

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="BugCollection" type="BugCollectionType"/>
  <xs:complexType name="BugCollectionType">
    <xs:sequence>
      <xs:element type="ProjectType" name="Project"/>
      <xs:element type="BugInstanceType" name="BugInstance" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="xs:string" name="Errors"/>
      <xs:element type="FindBugsSummaryType" name="FindBugsSummary"/>
      <xs:element type="xs:string" name="ClassFeatures"/>
      <xs:element type="xs:string" name="History"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="version"/>
    <xs:attribute type="xs:string" name="sequence"/>
    <xs:attribute type="xs:string" name="timestamp"/>
    <xs:attribute type="xs:string" name="analysisTimestamp"/>
    <xs:attribute type="xs:string" name="release"/>
  </xs:complexType>
  <xs:complexType name="ProjectType">
    <xs:sequence>
      <xs:element type="xs:string" name="Jar"/>
      <xs:element type="xs:string" name="SrcDir"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="filename"/>
    <xs:attribute type="xs:string" name="projectName"/>
  </xs:complexType>
  <xs:complexType name="FindBugsSummaryType">
    <xs:sequence>
      <xs:element type="PackageStatsType" name="PackageStats"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="timestamp"/>
    <xs:attribute type="xs:string" name="total_classes"/>
    <xs:attribute type="xs:string" name="total_bugs"/>
    <xs:attribute type="xs:string" name="total_size"/>
    <xs:attribute type="xs:string" name="num_packages"/>
    <xs:attribute type="xs:string" name="cpu_seconds"/>
    <xs:attribute type="xs:string" name="clock_seconds"/>
    <xs:attribute type="xs:string" name="peak_mbytes"/>
    <xs:attribute type="xs:string" name="gc_seconds"/>
    <xs:attribute type="xs:string" name="priority_3"/>
    <xs:attribute type="xs:string" name="priority_2"/>
  </xs:complexType>
  <xs:complexType name="SourceLineType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="classname" use="optional"/>
        <xs:attribute type="xs:string" name="sourcefile" use="optional"/>
        <xs:attribute type="xs:string" name="sourcepath" use="optional"/>
        <xs:attribute type="xs:string" name="start" use="optional"/>
        <xs:attribute type="xs:string" name="end" use="optional"/>
        <xs:attribute type="xs:string" name="startBytecode" use="optional"/>
        <xs:attribute type="xs:string" name="endBytecode" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="FieldType">
    <xs:sequence>
      <xs:element type="SourceLineType" name="SourceLine"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="classname"/>
    <xs:attribute type="xs:string" name="name"/>
    <xs:attribute type="xs:string" name="signature"/>
    <xs:attribute type="xs:string" name="isStatic"/>
  </xs:complexType>
  <xs:complexType name="ClassStatsType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="class"/>
        <xs:attribute type="xs:string" name="interface"/>
        <xs:attribute type="xs:string" name="size"/>
        <xs:attribute type="xs:string" name="bugs"/>
        <xs:attribute type="xs:string" name="priority_3"/>
        <xs:attribute type="xs:string" name="priority_2"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="MethodType">
    <xs:sequence>
      <xs:element type="SourceLineType" name="SourceLine"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="classname" use="optional"/>
    <xs:attribute type="xs:string" name="name" use="optional"/>
    <xs:attribute type="xs:string" name="signature" use="optional"/>
    <xs:attribute type="xs:string" name="isStatic" use="optional"/>
  </xs:complexType>
  <xs:complexType name="PackageStatsType">
    <xs:sequence>
      <xs:element type="ClassStatsType" name="ClassStats"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="package"/>
    <xs:attribute type="xs:string" name="total_bugs"/>
    <xs:attribute type="xs:string" name="total_types"/>
    <xs:attribute type="xs:string" name="total_size"/>
    <xs:attribute type="xs:string" name="priority_3"/>
    <xs:attribute type="xs:string" name="priority_2"/>
  </xs:complexType>
  <xs:complexType name="BugInstanceType">
    <xs:sequence>
      <xs:element type="ClassType" name="Class"/>
      <xs:element type="FieldType" name="Field" minOccurs="0"/>
      <xs:element type="MethodType" name="Method" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="type" use="optional"/>
    <xs:attribute type="xs:string" name="priority" use="optional"/>
    <xs:attribute type="xs:string" name="abbrev" use="optional"/>
    <xs:attribute type="xs:string" name="category" use="optional"/>
  </xs:complexType>
  <xs:complexType name="ClassType">
    <xs:sequence>
      <xs:element type="SourceLineType" name="SourceLine"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="classname" use="optional"/>
  </xs:complexType>
</xs:schema>
[/XML]


----------

