2011-11-30 55 views
1

我有xml,看起来有点类似于以下内容。我需要从属性和标签获取值并存储它们。但我不明白如何到达2级(3,4等)嵌套元素。我使用以下代码,我发现在互联网上,它使用DOM但我不能得到正确的RegNumber及其属性。提前致谢。Java:阅读许多嵌套元素的XML

nodeList = xmldocument.getElementsByTagName("Header");  
     if (nodeList != null && nodeList.getLength() > 0) { 
      for (int i = 0; i < nodeList.getLength(); i++) { 
       //get the header element 
       Element header = (Element) nodeList.item(i); 
       System.out.println("Element: " + ((Element)nodeList.item(i)).getNodeName()); 
       System.out.println(header.getAttribute("time")); 
      } 
     } 
     nodeList = xmldocument.getElementsByTagName("Document");  
     if (nodeList != null && nodeList.getLength() > 0) { 
      for (int i = 0; i < nodeList.getLength(); i++) { 

       //get the document element 
       Element document = (Element) nodeList.item(i); 
       System.out.println("Element: " + ((Element)nodeList.item(i)).getNodeName()); 
       System.out.println(document.getAttribute("Id")); 

       nodeList = document.getElementsByTagName("RegNumber"); 
       for (int j = 0; j < nodeList.getLength(); j++) { 

        //get the RegNumber element 
        Element regNumber = (Element) nodeList.item(j); 
        System.out.println("Element: " + ((Element)nodeList.item(j)).getNodeName()); 
        System.out.println(regNumber.getAttribute("regpoint")); 

       } 
      } 

     } 

XML:

<XML xsi:schemaLocation="http://www.codetools.it XSD2.xsd" xmlns="http://www.codetools.it" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
      <Header time="2001-12-17T09:30:47Z" /> 
      <Document Id="456"> 
       <RegNumber regpoint="" regdate="2001-12-17T09:30:47Z">123/456</RegNumber> 
       <Confident flag="0"/> 
       <DocNumber kind=""> 
        <RegNumber RegPoint="" regdate="2001-12-17T09:30:47Z">456/789</RegNumber> 
        <Organization fullname="lol" shortname="" ownership="lol" ogrn="78945612" inn=""> 
         <OfficialPerson> 
          <Name Firstname="John"/> 
          <Official Department="" post=""/> 
          <SignDate>2001-12-17T09:30:47Z</SignDate> 
         </OfficialPerson> 
         <Econtact type="1">[email protected]</Econtact> 
         <Address street="" settlement="" postcode="" postbox="" flat="" district="" region="" country="" nontypical="" house=""/> 
        </Organization> 
       </DocNumber> 
       <DocTransfer os="Windows" type=".docx" type_ver="" char_set="" description="kkkk"> 
    </DocTransfer> 
      <Reghistory idnumber=""> 
       <RegNumber RegPoint="" regdate=""/> 
       <Organization fullname="" shortname="" ownership="" ogrn="" inn=""> 
        <Econtact type=""/> 
        <Address street="" settlement="" postcode="" postbox="" flat="" district="" region="" country="" nontypical="" house=""/> 
       </Organization> 
      </Reghistory> 
      <Author> 
       <Organization fullname="" shortname="" ownership="" ogrn="12345678" inn=""> 
        <OfficialPerson> 
         <Name Firstname="" /> 
         <Official Department="" post=""/> 
         <SignDate>2011-12-17T09:30:47Z</SignDate> 
        </OfficialPerson> 
        <Econtact type="Рї">[email protected]</Econtact> 
        <Address street="" postcode="1234" postbox="" flat="" district="" region="" country="" nontypical="" house="12"/> 
       </Organization> 
       <PrivatePerson> 
        <Name Surname="" Firstname="" Fathername=""/> 
        <Econtact type=""/> 
        <Address street="" settlement="" postcode="" postbox="" flat="" district="" region="" country="" nontypical="" house=""/> 
        <SignDate/> 
        <Rank privilege="" socialposition="" sex=""/> 
       </PrivatePerson> 
      </Author> 
      <Validator attestation="0"> 
       <DocNumber kind="наказ"> 
        <RegNumber RegPoint="" regdate="2001-12-17T09:30:47Z"/> 
        <Organization fullname="" shortname="" ownership="" ogrn="14725836" inn=""> 
         <Econtact type="Рї">[email protected]</Econtact> 
         <Address street="" settlement="" postcode="" postbox="" flat="" district="" region="" country="" nontypical="" house=""/> 
        </Organization> 
       </DocNumber> 
       <Organization fullname="" shortname="РљРњРЈ" ownership="" ogrn="96325878" inn=""> 
        <Econtact type="String">[email protected]</Econtact> 
        <Address street="Пушкіна" settlement="" postcode="4563" postbox="" flat="" district="" region="" country="" nontypical="" house="23"/> 
        <OfficialPerson> 
         <Name Surname="" Firstname="" Fathername=""/> 
         <Official Department="" post=""/> 
         <SignDate>2011-12-17T09:30:47Z</SignDate> 
        </OfficialPerson> 
       </Organization> 
       <PrivatePerson> 
        <Name Surname="" Firstname="" Fathername=""/> 
        <Econtact type=""></Econtact> 
        <Address street="" settlement="" postcode="" postbox="" flat="" district="" region="" country="" nontypical="" house=""/> 
        <SignDate></SignDate> 
        <Rank privilege="" socialposition="" sex=""/> 
       </PrivatePerson> 
      </Validator> 
      <Addressee> 
       <Referred id="" retype=""> 
        <RegNumber regdate="" regpoint=""/> 
        <TaskNumber taskDate=""/> 
       </Referred> 
       <Organization fullname="String" shortname="" ownership="" ogrn="85236974" inn=""> 
        <OfficialPerson> 
         <Name Surname="" Firstname="" Fathername=""/> 
         <Official Department="" post=""/> 
        </OfficialPerson> 
        <Econtact type="Рї">[email protected]</Econtact> 
        <Address street="" settlement="" postcode="" postbox="" flat="" district="" region="" country="" nontypical="" type="" house=""/> 
       </Organization> 
       <PrivatePerson> 
        <Name Surname="" Firstname="" Fathername=""/> 
        <Econtact type=""></Econtact> 
        <Address street="" settlement="" postcode="" postbox="" flat="" district="" region="" country="" nontypical="" house=""/> 
        <Rank privilege="" socialposition="" sex=""/> 
       </PrivatePerson> 
      </Addressee> 
      <Writer> 
       <Organization fullname="" shortname="" ownership="" ogrn="" inn=""> 
        <OfficialPerson> 
         <Name Surname="" Firstname="" Fathername=""/> 
         <Econtact type=""></Econtact> 
        </OfficialPerson> 
       </Organization> 
       <PrivatePerson> 
        <Name Surname="" Firstname="" Fathername=""/> 
        <Econtact type=""></Econtact> 
       </PrivatePerson> 
      </Writer> 
     </Document> 

编辑。据建议,我试图弄清楚JAXB thingy。 xjc工具生成了3个类:ObjectFactory,package-info,XML。我发现这个代码从XML创建对象:

public static void main(String[] args) { 
     try { 

      File file = new File("F:\\Untitled3.xml"); 
      JAXBContext jaxbContext = JAXBContext.newInstance(XML.class); 

      Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
      XML xml = (XML) jaxbUnmarshaller.unmarshal(file); 
      System.out.println(xml); 

     } catch (JAXBException e) { 
      e.printStackTrace(); 
     } 
    } 

这是正确的方法,或者我需要使用的ObjectFactory?:

ObjectFactory f =new ObjectFactory(); 
      XML xml1 = f.createXML(); 

如何创建对象所有的标签和属性,然后从它创建xml文件?我新来java和jaxb的东西,所以请忍受我。

+2

你真的想手动解析XML吗?有更好的方法,看看[JAXB](http://en.wikipedia.org/wiki/Java_Architecture_for_XML_Binding) –

+0

谢谢你的回答。我真的不知道我应该用什么。我刚刚通过Google搜索“Java xml read”发现了Dom的东西,它对我来说很简单。您能否给我一些关于JAXB初学者的链接? – bunnyjesse112

回答

3

它通常是没有意义或方法,让你在一定的深度访问节点中很常用。这不仅是关于Java,而是关于DOM规范,我相信这是正确的决定。

人们通常是通过许多有意义的方式之一访问节点:

  1. 通过标签名称和标记名称通常表示该节点的意义。
  2. XPath - 表示文档的完整结构。
  3. 绑定,例如JAXB(基本上你是不是在处理XML的任何以上,但Java类)
  4. 有旧的SAX(未DOM)和StAX的(DOM和SAX的混合物)

查找xpath,这将是非常有用的。

+0

感谢您的回答。您能否将我的一些教程链接给JAXB的初学者? – bunnyjesse112

+0

再次感谢。如果有办法将我的xml文件(我有它的xsd文件)转换为准备用于jaxb的类? Hibernate有类似的东西。我怀疑我可以手动编写并正确注释它。再次感谢。 – bunnyjesse112

+1

+1 - @ bunnyjesse112如果您已经有了XML模式,您可以使用XJC工具来生成对象模型。从我的博客下面的帖子演示如何做到这一点:http://blog.bdoughan.com/2010/09/processing-atom-feeds-with-jaxb.html –

1

在每个节点上再次使用“getElementsByTagName”函数以通过标签名称获取元素。很显然......

下面是去几级深我的示例代码:

DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document doc = db.parse(acpFile); 
     Element docEle = doc.getDocumentElement(); 
     NodeList series = docEle.getElementsByTagName("dod:recordSeries"); 

     if(series != null && series.getLength()>0) 
     { 
      for(int i=0; i<series.getLength(); i++) 
      { 
       Element serie = (Element)series.item(i); 
       System.out.println("S -- "+serie.getAttribute("view:childName")); 
       NodeList categories = serie.getElementsByTagName("dod:recordCategory"); 

       for(int j=0; j<categories.getLength(); j++) 
       { 
        Element category = (Element)categories.item(j); 
        System.out.println("C ---- "+category.getAttribute("view:childName")); 
        NodeList recordFolders = category.getElementsByTagName("rma:recordFolder"); 

        for(int k=0; k<recordFolders.getLength(); k++) 
        { 
         Element folder = (Element)recordFolders.item(k); 
         System.out.println("F ------ "+folder.getAttribute("view:childName")); 
        } 
       } 
      } 
     } 
+0

感谢您的回答。但是,如果不仅意味着类别? – bunnyjesse112