【问题标题】:How to convert xml data in Java object using JAXB?如何使用 JAXB 转换 Java 对象中的 xml 数据?
【发布时间】:2019-05-15 06:38:21
【问题描述】:

我是 JAXB 转换的新手。我的标签以<DataSet> 开头,但我需要在<NewDataSet> 标签中访问来自<TABLE> 的数据。任何确切的建议或如果有任何问题请帮助我。

我也尝试了很多转换,但没有得到确切的解决方案。

<?xml version="1.0" encoding="utf-8"?> <DataSet xmlns="http://www.test.com"> <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="Table"> <xs:complexType> <xs:sequence> <xs:element name="ID" type="xs:decimal" minOccurs="0" /> <xs:element name="NAME" type="xs:string" minOccurs="0" /> <xs:element name="ADDRESS" type="xs:string" minOccurs="0" /> <xs:element name="PIN" type="xs:decimal" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> <NewDataSet xmlns=""> <Table diffgr:id="Table1" msdata:rowOrder="0"> <ID>1</ID> <NAME>Rajesh</NAME> <ADDRESS>Pune</ADDRESS> <PIN>412411</PIN> </Table> <Table diffgr:id="Table2" msdata:rowOrder="1"> <ID>2</ID> <NAME>Ajinkya</NAME> <ADDRESS>Mumbai</ADDRESS> <PIN>412504</PIN> </Table> </NewDataSet> </diffgr:diffgram> </DataSet>

我的java代码是-

File file = new File("/home/raj/Desktop/info.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(NewDataSet.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
NewDataSet dType = (NewDataSet) unmarshaller.unmarshal(file);

得到以下异常:

javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"DataSet"). Expected elements are <{}NewDataSet>

【问题讨论】:

  • 我不明白你到底想说什么@M.Deinum?你明白我的问题了吗,如果没有,请在这里评论。我将尝试详细解释。我刚开始提问。
  • 你只在这里转储了一个 XSD,你甚至没有尝试过(至少从你的问题中没有显示出来)处理传入的 XML 的东西。
  • 好的@M.Deinum,你的意思是我应该添加我的java代码,我也尝试过处理这个xml数据。实际上,如果我要添加所有代码,这将是一个大文件,所以我直接问了这个。可能有人有好的建议。
  • 我已经使用这个命令xjc -d src -p com.test.jaxb.beans test.xsd从我的xml中给定的xsd生成了类。

标签: java xml spring xsd xjc


【解决方案1】:

只是想帮忙。如果您在从 xml 转换后已经有结果的确切类数据。我建议您阅读 dzon 的这篇好文章:Using JAXB for XML With Java

以下是从 xml 转换为数据类的示例代码:

    File file = new File("product.xml");
    JAXBContext jaxbContext = JAXBContext.newInstance(Product.class);
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
    product = (Product) unmarshaller.unmarshal(file);
    System.out.println(product);

如果是自定义xml,那么我认为你必须使用一些html dom,手动转换它。这是使用 html dom 的示例:Java Read XML – Java DOM Parser Example

这里是java中使用xml解析dom的示例代码:

//Get Document Builder
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

//Build Document
Document document = builder.parse(new File("employees.xml"));

//Normalize the XML Structure; It's just too important !!
document.getDocumentElement().normalize();

//Here comes the root node
Element root = document.getDocumentElement();
System.out.println(root.getNodeName());

//Get all employees
NodeList nList = document.getElementsByTagName("employee");
System.out.println("============================");

for (int temp = 0; temp < nList.getLength(); temp++)
{
 Node node = nList.item(temp);
 System.out.println("");    //Just a separator
 if (node.getNodeType() == Node.ELEMENT_NODE)
 {
    //Print each employee's detail
    Element eElement = (Element) node;
    System.out.println("Employee id : "    + eElement.getAttribute("id"));
    System.out.println("First Name : "  + eElement.getElementsByTagName("firstName").item(0).getTextContent());
    System.out.println("Last Name : "   + eElement.getElementsByTagName("lastName").item(0).getTextContent());
    System.out.println("Location : "    + eElement.getElementsByTagName("location").item(0).getTextContent());
 }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多