empty node value in xml file

Post Reply
Krzysztof Mycek
Member
Posts: 30
Joined: Tue Mar 03, 2020 11:28 am

empty node value in xml file

Post by Krzysztof Mycek »

Hi I have a problem with empty node in XML

When my script get a empty value I have a error like:
Error in line 28 of script : Undefined member function 'getValue' for object 'undefined' of type: 'Undefined'
I don't know how to handle this error so that the connector with the script doesn't block and block the whole flow.
Can anyone help me?

XML:

<properties>
<property>
<number label="numer segmentu">22067501</number>
</property>
<property>
<name label="Kolorystyka">color_name</name>
<value>4/0</value>
<name label="Spad">Bleed</name>
<left>0.3</left>
<right>0.3</right>
<up>0.3</up>
<down>0.3</down>
</property>
<property>
<name label="Nazwa pliku do druku">file_path</name>
<value1 label="W_1_STR_A">BRZOZA1_100x70_spoady_2i5mm</value1>
<value2 label="W_2_STR_A">BRZOZA2_100x70_spoady_2i5mm</value2>
<value3 label="W_3_STR_A">DYWERGENCJA_70x100_spady_2i5mm</value3>
<value4 label="W_4_STR_A">KONWERGENCJA_70x100_spady_2i5mm</value4>
<value5 label="W_5_STR_A">SWIATLOWOD_70x100_spady_2i5mm</value5>
<value6 label="W_6_STR_A">skala_1_2_BRZOZA1_100x70_spoady_2i5mm</value6>
<value7 label="W_7_STR_A">skala_1_10_BRZOZA1_100x70_spoady_2i5mm</value7>
<value8 label="W_8_STR_A">zamienione_wymiary_SWIATLOWOD_70x100_spady_2i5mm</value8>
<value9 label="W_9_STR_A"></value9>
</property>
<property>
<name label="Nazwa pliku do druku">file_path</name>
</property>
<property>
<name label="Operacje wykończeniowe po druku">finish_name</name>
<value1>KONG3_WYCI</value1>
</property>
<property>
<name label="Wysokość">height</name>
<value>70.0</value>
<name label="Szerokość">width</name>
<value>100.0</value>
</property>
<property>
<name label="Maszyna drukująca">printer_machine_name</name>
<value>DURST RHO 2500 01</value>
</property>
<property>
<name label="Podłoże do druku">surface_name</name>
<value>PCW S 3 156 305</value>
<name label="Gramatura materiału">weight</name>
<value>2100</value>
<name label="Szerokość materiału">Width</name>
<value>156.0</value>
<name label="Długość/wysokość materiału">Height/lenght</name>
<value>305.0</value>
</property>
<property>
<name label="Nakład brutto">Quantity</name>
<value1 label="WARIANT_1">1</value1>
<value2 label="WARIANT_2">2</value2>
<value3 label="WARIANT_3">3</value3>
<value4 label="WARIANT_4">4</value4>
<value5 label="WARIANT_5">5</value5>
<value6 label="WARIANT_5">5</value6>
<value7 label="WARIANT_5">5</value7>
<value8 label="WARIANT_5">5</value8>
<value9 label="WARIANT_5">5</value9>
</property>
<property>
<name label="Naddatek">Additional_material</name>
<left>0</left>
<right>0</right>
<up>0</up>
<down>0</down>
</property>
</properties>


script:

// Is invoked each time a new job arrives in one of the input folders for the flow element.
// The newly arrived job is passed as the second parameter.
function jobArrived( s : Switch, job : Job )
{
var dataset = job.getDataset("Xml");
var xml = new Document(dataset.getPath());
var name = job.getNameProper();
var reg = /\d+$/;
var newStr = name.match(reg, "");
s.log(1, "zmiana: " + newStr);

var nodeList = xml.evalToNodes("/properties/property[3]/*"); // Sprawdzamy ile mamy nodeów z nazwami plików (pierwszy jest śmieciem)
var nodeList2 = xml.evalToNodes("/properties/property[9]/*"); // Sprawdzamy ile mamy nodeów z ilościami (pierwszy jest śmieciem)
var nodeList3 = xml.evalToNodes("/properties/property[3]//@label"); // Sprawdzamy ile mamy labelek
var wysokosc_XML = xml.evalToString("/properties/property[6]/value[1]"); //odczytanie wysokosci z XML
var szerokosc_XML = xml.evalToString("/properties/property[6]/value[2]"); //odczytanie szerokosci z XML


s.log(1, "Found: " + nodeList.length);
s.log(1, "Found: " + nodeList2.length);
s.log(1, "Found: " + nodeList3.length);


for (var i = 1; i < nodeList.length; i++) {
var node = nodeList.at(i);
var node2 = nodeList2.at(i);
var node3 = nodeList3.at(i);
var code = node.getFirstChild().getValue();
var code2 = node2.getFirstChild().getValue();
var code3 = node.getAttributeValue("label");
s.log(2, "value " + i + " = " + code);
s.log(3, "value " + i + " = " + code2);
s.log(3, "value " + i + " = " + code3);

s.log(2, "wysokosc " + "=" + wysokosc_XML);
s.log(2, "szerokosc " + "=" + szerokosc_XML);




job.setPrivateData("wysokosc_XML", wysokosc_XML); // tu zwracamy do privatedata wysokosc z XML
job.setPrivateData("szerokosc_XML", szerokosc_XML); // u zwracamy do privatedata szerokosc z XML




job.setPrivateData("nazwa_pliku", code); // tu zwracamy do privatedata nazwę pliku
job.setPrivateData("ilosc", code2); // tu zwracamy do privatedata ilości
job.setPrivateData("label", code3); // tu zwracamy do privatedata ilości



job.sendToSingle( job.getPath(), job.getName())

}}


// Is invoked at regular intervals regardless of whether a new job arrived or not.
// The interval can be modified with s.setTimerInterval().
//function timerFired( s : Switch )
//{
//}

// Is invoked each time a new webhook request arrives, if the entry point has subscribed to the request.
// The newly arrived request is passed as the second parameter.
//function webhookTriggered( s : Switch, r : WebhookRequest )
//{
//}
Krzysztof Mycek
Member
Posts: 30
Joined: Tue Mar 03, 2020 11:28 am

Re: empty node value in xml file

Post by Krzysztof Mycek »

This modification not work correct too. Always the same script error when XML noda are empty

Code: Select all

// Is invoked each time a new job arrives in one of the input folders for the flow element.
// The newly arrived job is passed as the second parameter.
// Is invoked each time a new job arrives in one of the input folders for the flow element.
// The newly arrived job is passed as the second parameter.
function jobArrived( s : Switch, job : Job )
{
var dataset = job.getDataset("Xml");
var xml = new Document(dataset.getPath());
var name = job.getNameProper();
var reg = /\d+$/;
var newStr = name.match(reg, "");
s.log(1, "zmiana: " + newStr);

var nodeList = xml.evalToNodes("/properties/property[3]/*"); // Sprawdzamy ile mamy nodeów z nazwami plików (pierwszy jest śmieciem)
var nodeList2 = xml.evalToNodes("/properties/property[9]/*"); // Sprawdzamy ile mamy nodeów z ilościami (pierwszy jest śmieciem)
var nodeList3 = xml.evalToNodes("/properties/property[3]//@label"); // Sprawdzamy ile mamy labelek
var wysokosc_XML = xml.evalToString("/properties/property[6]/value[1]"); //odczytanie wysokosci z XML
var szerokosc_XML = xml.evalToString("/properties/property[6]/value[2]"); //odczytanie szerokosci z XML


s.log(1, "Found: " + nodeList.length);
s.log(1, "Found: " + nodeList2.length);
s.log(1, "Found: " + nodeList3.length);


for (var i = 1; i < nodeList.length; i++) {
	var node = nodeList.at(i);
	if (node.getFirstChild().getValue() !== null){
	var node2 = nodeList2.at(i);
	var node3 = nodeList3.at(i);
	var code = node.getFirstChild().getValue(); 
	var code2 = node2.getFirstChild().getValue();
	var code3 = node.getAttributeValue("label");
	s.log(2, "value  " + i + " = " + code);
	s.log(3, "value  " + i + " = " + code2);
	s.log(3, "value  " + i + " = " + code3);
	
	s.log(2, "wysokosc  " + "="  + wysokosc_XML);
	s.log(2, "szerokosc  " + "="  + szerokosc_XML);

	
	
	

	job.setPrivateData("wysokosc_XML", wysokosc_XML); // tu zwracamy do privatedata wysokosc z XML
	job.setPrivateData("szerokosc_XML", szerokosc_XML); // u zwracamy do privatedata szerokosc z XML
	
	
	

	job.setPrivateData("nazwa_pliku", code); // tu zwracamy do privatedata nazwę pliku
	job.setPrivateData("ilosc", code2); // tu zwracamy do privatedata ilości
	job.setPrivateData("label", code3); // tu zwracamy do privatedata ilości


	job.sendTo(getConnectionByName(s, 'Success'), job.getPath());
	s.log(2, "Success");
		} else {
			job.sendTo(getConnectionByName(s, 'Error'), job.getPath());
			s.log(2, "Error");
		}
	}



function getConnectionByName( s: Switch, connectionName: String ): Connection
{
	var theConnections = s.getOutConnections();
	for (var i = 0; i < theConnections.getCount(); i++) {
		// Get this connection
		var theConnection = theConnections.at(i);
		if (theConnection.getName() == connectionName) {
		    return theConnection;
		}
	}
	return null;
}

// Is invoked each time a new webhook request arrives, if the entry point has subscribed to the request.
// The newly arrived request is passed as the second parameter.
//function webhookTriggered( s : Switch, r : WebhookRequest )
//{
//}
function timerFired( s : Switch )
{
}}
mkayyyy
Member
Posts: 73
Joined: Mon Nov 21, 2016 6:31 pm
Location: UK

Re: empty node value in xml file

Post by mkayyyy »

I would add a check using the hasChildNodes method before calling getFirstChild and getValue:

Code: Select all

// Is invoked each time a new job arrives in one of the input folders for the flow element.
// The newly arrived job is passed as the second parameter.
function jobArrived( s : Switch, job : Job )
{
	var dataset = job.getDataset("Xml");
	var xml = new Document(dataset.getPath());
	var name = job.getNameProper();
	var reg = /\d+$/;
	var newStr = name.match(reg, "");
	s.log(1, "zmiana: " + newStr);
	
	var nodeList = xml.evalToNodes("/properties/property[3]/*"); // Sprawdzamy ile mamy nodeów z nazwami plików (pierwszy jest śmieciem)
	var nodeList2 = xml.evalToNodes("/properties/property[9]/*"); // Sprawdzamy ile mamy nodeów z ilościami (pierwszy jest śmieciem)
	var nodeList3 = xml.evalToNodes("/properties/property[3]//@label"); // Sprawdzamy ile mamy labelek
	var wysokosc_XML = xml.evalToString("/properties/property[6]/value[1]"); //odczytanie wysokosci z XML
	var szerokosc_XML = xml.evalToString("/properties/property[6]/value[2]"); //odczytanie szerokosci z XML
	
	
	s.log(1, "Found: " + nodeList.length);
	s.log(1, "Found: " + nodeList2.length);
	s.log(1, "Found: " + nodeList3.length);


	for (var i = 1; i < nodeList.length; i++) {
		var node = nodeList.at(i);
		var node2 = nodeList2.at(i);
		var node3 = nodeList3.at(i);
		
		var code = node.hasChildNodes() ? node.getFirstChild().getValue() : "";
		var code2 = node2.hasChildNodes() ? node2.getFirstChild().getValue() : "";
		
		var code3 = node.getAttributeValue("label");
		s.log(2, "value " + i + " = " + code);
		s.log(3, "value " + i + " = " + code2);
		s.log(3, "value " + i + " = " + code3);
		
		s.log(2, "wysokosc " + "=" + wysokosc_XML);
		s.log(2, "szerokosc " + "=" + szerokosc_XML);
		
		job.setPrivateData("wysokosc_XML", wysokosc_XML); // tu zwracamy do privatedata wysokosc z XML
		job.setPrivateData("szerokosc_XML", szerokosc_XML); // u zwracamy do privatedata szerokosc z XML
		
		job.setPrivateData("nazwa_pliku", code); // tu zwracamy do privatedata nazwę pliku
		job.setPrivateData("ilosc", code2); // tu zwracamy do privatedata ilości
		job.setPrivateData("label", code3); // tu zwracamy do privatedata ilości
		
		job.sendToSingle( job.getPath(), job.getName());
	}
}
Krzysztof Mycek
Member
Posts: 30
Joined: Tue Mar 03, 2020 11:28 am

Re: empty node value in xml file

Post by Krzysztof Mycek »

Great! Thank You! Thats working.
Post Reply