For a long time now, I have been using a script to import data from XML data files into a LiveCycle form, using a script originally offered by @radzmar . That script starts as follows:
function importXML(){
// Wenn PDF-Viewer älter als 9.2 ist, funktioniert der Import nicht!
if (parseFloat(app.viewerVersion) < 9.2) {
xfa.host.messageBox("You must use Adobe Reader version 9.2 or greater for this import function to operate.", "Your version of Adobe Reader is too old", 0, 0);
} else {
// Externe Datei laden.
var vStream = util.readFileIntoStream();
if (vStream) {
var vImport, vImportData, vImportXML, vNGEXML;
try {
// Die folgende Zeile sieht nur weges des regulären Ausdrucks aus, als ob sie auskommentiert wäre, ist aber sehr wichtig!!!
vImport = util.stringFromStream(vStream)
.replace(/(\<\?.*\?\>\s*)|(\<!-{2}(.|\n|\r)*-{2}\>)|(\r\n|\r|\n)/g, "");
vImportData = eval(vImport);
vImportXML = vImportData.toXMLString();
// Assign the XML code as a string value to Textfield1
form1.SfDataImport.TfAurImport.rawValue = vImportXML;
Occasionally, that import script failed and I figured it was because the XML data file included curly brackets {} in the data fields.
I am wondering if there is a way to modify the script so it would not fail but replace curly brackets by parentheses and therefore prevent the script's failure.
By the way, can you explain what the following line does in that script?
.replace(/(\<\?.*\?\>\s*)|(\<!-{2}(.|\n|\r)*-{2}\>)|(\r\n|\r|\n)/g, "");
Thank you in advance.
Solved! Go to Solution.
Views
Replies
Total Likes
Hi,
the import function isn't the problem, it's your additional code that fails.
I've stripped down the code to the bare neccessariest, and the import works without problems with your XML.
You can see the imported date in the field under form1.SfDataImport.TfNgeImport.
function importXML(){ // Import is only available with Reader 9.2 and above if (parseFloat(app.viewerVersion) < 9.2) { xfa.host.messageBox("You must use Adobe Reader version 9.2 or greater for this import function to operate.", "Your version of Adobe Reader is too old", 0, 0); } else { // Import external file var vStream = util.readFileIntoStream(); if (vStream) { var vStreamData, oXML; try { // Version 1: Import XML file and remove its XML declarations // vStreamData = util.stringFromStream(vStream, "utf-8").replace(/^\<\?.*\?\>$/gm, ""); // Version 2: Import XML file and remove its XML declarations and whitespaces vStreamData = util.stringFromStream(vStream).replace(/(\<\?.*\?\>\s*)|(\<!-{2}(.|\n|\r)*-{2}\>)|(\r\n|\r|\n)/g, ""); // Optional: Create a data node in the RAM and store the imported data in it. It can be used to analyse the imported data. // With oXML.nodes.item(0).name; for example, you can check the name of the first element in the XML tree to control the correct XML file was imported. oXML = xfa.datasets.createNode("dataGroup", "importData"); oXML.loadXML(vStreamData, false, false); // Version 1: Assign the XML code as a string value to text field from import // form1.SfDataImport.TfNgeImport.rawValue = vStreamData; // Version 2: Assign the XML code as a string value to text field from data node form1.SfDataImport.TfNgeImport.rawValue = oXML.nodes.item(0).saveXML("pretty").replace(/^\<\?.*\?\>$/gm, ""); return true; // When import has failed. } catch (e) { vImport = ""; var cMsg = "The import failed because the file may not be an XML data file.\n\nThe import was interrupted.\n\nError details: " + e; xfa.host.messageBox(cMsg, "Error during Import", 0, 0); return false; } } } }
You should run you additional code in a separate function outside the try-catch since every little error will interrupt the import function.
The replace method replaces the XML declarations that can appear at the beginning of every XML file. The import function can't handle this, so it has to be removed.
Do you have a sample file with the curly brackets?
Thanks for taking the time.
here is the link to the form: https://drive.google.com/file/d/1pBiPnw5E0m9bppGMDkLph0JnYnQxvOhB/view?usp=drivesdk
here is the link to the XML data file: https://drive.google.com/file/d/1LbPgVXfae-sGoZmWeC8g7h4R5HVa-gcF/view?usp=drivesdk
in the form, the import XML function is on both buttons on the top right of the page. The dummy data file should be uploaded using the « Import NGE button »
i know I can edit the XML data file to remove the curly brackets… which is the only solution I currently have. My concern is that there may be many different users of this form and I won’t be able to train them all to that level.
thx.
Hi,
the import function isn't the problem, it's your additional code that fails.
I've stripped down the code to the bare neccessariest, and the import works without problems with your XML.
You can see the imported date in the field under form1.SfDataImport.TfNgeImport.
function importXML(){ // Import is only available with Reader 9.2 and above if (parseFloat(app.viewerVersion) < 9.2) { xfa.host.messageBox("You must use Adobe Reader version 9.2 or greater for this import function to operate.", "Your version of Adobe Reader is too old", 0, 0); } else { // Import external file var vStream = util.readFileIntoStream(); if (vStream) { var vStreamData, oXML; try { // Version 1: Import XML file and remove its XML declarations // vStreamData = util.stringFromStream(vStream, "utf-8").replace(/^\<\?.*\?\>$/gm, ""); // Version 2: Import XML file and remove its XML declarations and whitespaces vStreamData = util.stringFromStream(vStream).replace(/(\<\?.*\?\>\s*)|(\<!-{2}(.|\n|\r)*-{2}\>)|(\r\n|\r|\n)/g, ""); // Optional: Create a data node in the RAM and store the imported data in it. It can be used to analyse the imported data. // With oXML.nodes.item(0).name; for example, you can check the name of the first element in the XML tree to control the correct XML file was imported. oXML = xfa.datasets.createNode("dataGroup", "importData"); oXML.loadXML(vStreamData, false, false); // Version 1: Assign the XML code as a string value to text field from import // form1.SfDataImport.TfNgeImport.rawValue = vStreamData; // Version 2: Assign the XML code as a string value to text field from data node form1.SfDataImport.TfNgeImport.rawValue = oXML.nodes.item(0).saveXML("pretty").replace(/^\<\?.*\?\>$/gm, ""); return true; // When import has failed. } catch (e) { vImport = ""; var cMsg = "The import failed because the file may not be an XML data file.\n\nThe import was interrupted.\n\nError details: " + e; xfa.host.messageBox(cMsg, "Error during Import", 0, 0); return false; } } } }
You should run you additional code in a separate function outside the try-catch since every little error will interrupt the import function.
Wow. Thank you so much.
I'll do exactly as you suggest...