podmiana konkretnych danych w pliku XML

0

Hej,

Chcę podmienic dane w pliku XML. Naskrobałam coś takiego :


try{
		 String filepath = "c:\\zapas1.xml";
		 DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
		 DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
		 Document doc = docBuilder.parse(filepath);
	 
		
		
	     Node wez = doc.getElementsByTagName("Activity").item(661);
	 
		 NodeList list = wez.getChildNodes();
	 
		 for (int i =0; i<list.getLength();i++){
			 Node node = list.item(i);
	 
			
			 if("CompressedRichText".equals(node.getNodeName())){
				 node.setTextContent(tablica[i]);
			 }
		 }

		
	     TransformerFactory transformerFactory = TransformerFactory.newInstance();
	     Transformer transformer = transformerFactory.newTransformer();
	     DOMSource source = new DOMSource(doc);
	     StreamResult result =  new StreamResult(new File(filepath));
	     transformer.transform(source, result);
	 
	     System.out.println("Done");
	 
	   }
 

Dlaczego podmienia mi dane tylko w pierwszym węźle a nie leci do końca pliku ?

0

'.item(661);' <- na pewno tak mialo byc ?

0
eeee napisał(a)

'.item(661);' <- na pewno tak mialo byc ?

aj wkleiłam kod po próbach, bazowo tam było zero, lecz w momencie kiedy wstawiłam tam inną wersję, program uzupełniał więcej węzłów nowymi danymi. Myślałam więc że chodzi tu o ilość powtórzeń, jednak zapełnił może z 15 węzłów i na tym się skończyło. Do tego nie uzupełniał węzłów po kolei.

0

pokaz jeszcze tego xml

0

Plik XML na którym operuje jest mocno rozbudowany

 
<Contact>
        <EntryGUID>b544147d-1992-4b43-ba9c-003b8ae55d06</EntryGUID>
        <FullName>***</FullName>
        <FirstName>***</FirstName>
        <LastName>***</LastName>
        <FileAs>***</FileAs>
        <JobTitle>***</JobTitle>
        <CompanyName>***</CompanyName>
        <Active>True</Active>
        <WorkAddressCity>***</WorkAddressCity>
        <WorkAddressCountry>***/WorkAddressCountry>
        <Picklist>
            <Id>851fc165-d302-4e0b-a2ad-f9c32fdc65a5</Id>
            <GuidAndValue>
                <Guid>8650b887-8c89-43ab-80c9-302d615bc6e4</Guid>
                <Value>linkedin</Value>
            </GuidAndValue>
        </Picklist>
        <DoNotCall>False</DoNotCall>
        <DoNotEmail>False</DoNotEmail>
        <DoNotFax>False</DoNotFax>
        <DoNotSendLetter>False</DoNotSendLetter>
        <ModifiedOn>Mon, 24 Jan 2011 12:22:52 GMT</ModifiedOn>
        <ModifiedBy>***</ModifiedBy>
        <Lead>False</Lead>
        <CreatedBy>***</CreatedBy>
        <MailingAddressIndicator>2</MailingAddressIndicator>
        <EmailAddresses>
            <EmailAddress>j***</EmailAddress>
            <EmailDisplayAs>***</EmailDisplayAs>
        </EmailAddresses>
        <UserField>
            <FieldGUID>155b7003-a109-4055-8dcb-2d129bee9f33</FieldGUID>
            <Value>0</Value>
        </UserField>
        <UserField>
            <FieldGUID>821fd2f1-b40f-4bef-8b68-c7197f668a54</FieldGUID>
            <Value>****</Value>
        </UserField>
        <Activity>
            <ActivityGUID>c84e7344-f90a-4993-a478-c8c74747a592</ActivityGUID>
            <ActivityType>14</ActivityType>
            <Subject>***</Subject>
            <ActivityDate>Wed, 29 Apr 2009 14:29:32 GMT</ActivityDate>
            <CreatedOn>Wed, 29 Apr 2009 14:29:32 GMT</CreatedOn>
            <CreatedBy>***</CreatedBy>
            <ModifiedBy>***</ModifiedBy>
            <ModifiedOn>Wed, 29 Apr 2009 14:29:32 GMT</ModifiedOn>
            <ActivityDuration>0</ActivityDuration>
            <ActivityEndTime>Wed, 29 Apr 2009 14:29:00 GMT</ActivityEndTime>
            <ActivityPercentComplete>0</ActivityPercentComplete>
            <CompressedRichText>1D1800008D00200F5C0</CompressedRichText>
            <IconIndex>-1</IconIndex>
            <MessageDeliveryTime>Wed, 29 Apr 2009 14:29:32 GMT</MessageDeliveryTime>
        </Activity>
    </Contact>

0

Zrób tak:
NodeList list = doc.getElementsByTagName("CompressedRichText");

             for (int i =0; i<list.getLength();i++){
                     Node node = list.item(i);                     
                             node.setTextContent(tablica[i]);                      
             }

To co próbowałeś zrobić omijało teksty z tablicy, którym odpowiadały inne węzły niż szukany. Byłby to poważny problem. Poza tym jak chcesz, żeby był brany CompressedRichText tylko w Activity, to na liście sprawdzaj nazwę parenta. Tylko wtedy proponuję zrobić osobny indeks do tablicy inkrementowany, jeżeli węzeł będzie miał właściwe położenie.

0

Z tego co widzę, pobierasz konkretny kontakt i w wezle 'activity' szukasz wezla 'CompressedRichText'. Jesli chcesz zeby robil to na wszystkich kontaktach to powinno byc tak:

NodeList contacts = doc.getElementsByTagName("Contact");
for(int j = 0 ; j < contacts.getLength() ; j++) {
   Node contact = contacts.item(j);
   NodeList contactTags = contact.getChildNodes();
   for(int i = 0 ; i < contactTags.getLength() ; i ++) {
      Node contactTag = contactTags.item(i);
      if(contactTag.getNodeName().equals("Activity")) {
         NodeList activitiesChildren = contactTag.getChildNodes();
         for(int k = 0 ; k < activitiesChildren.getLength() ; k++) {
            Node node = activitiesChildren.item(k);
            if(node .getNodeName().equals("CompressedRichText")) {
               node.setTextContent(tablica[i]);
            }
         }
      }
   }
}
0

dziękuje Ci bardzo, wszystko śmiga jak należy :). Teraz "tylko" zdekompresowac strumien w tabeli i gotowe :).

1 użytkowników online, w tym zalogowanych: 0, gości: 1