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 )
//{
//}
empty node value in xml file
-
- Member
- Posts: 30
- Joined: Tue Mar 03, 2020 11:28 am
Re: empty node value in xml file
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 )
{
}}
Re: empty node value in xml file
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());
}
}
-
- Member
- Posts: 30
- Joined: Tue Mar 03, 2020 11:28 am
Re: empty node value in xml file
Great! Thank You! Thats working.