In my JCA scan example, and my other scripts, at some points I need to read and interpret the found xml document to get the information from it in ANT and save it to a file. For that I used XSL to transform the particular document to be able to address the particular elements as properties in ANT.
In my latest fiddlings I need to gather all the references of elements from a large base xsd in XSDs, WSDLs, BPELs, XSLTs and composite.xml. I found quickly that transforming a wsdl or xsd using XSLT hard, if not near to impossible. For instance, I needed to get all the type attributes referencing an element or type within the target namespace of the referenced base xsd. And although mostly the same namespace prefix is used, I can't rely on that. So in the end I used a few JavaScript functions to parse the document as a string.
Now, at this point I wanted to get all the named xsd:complexTypes, and then I found it fun to try that into a node js script. You might be surprised, but I haven't done this before, although I did some JavaScript once in a while. I might have done some demo node js try-outs, but don't count those.
So I came up with this script:
const fs = require('fs'); var myArgs = process.argv.slice(2); const xsdFile=myArgs[0]; const complexTypeFile = myArgs[1]; // const complexTypeStartTag="<xsd:complexType" // Log arguments console.log('myArgs: ', myArgs); console.log('xsd: ', xsdFile); // // Exctract an attribute value from an element function getAttributeValue(element, attributeName){ var attribute ="" var attributePos=element.indexOf(attributeName); if (attributePos>-1){ attribute = element.substring(attributePos); attributePos=attribute.indexOf("=")+1; attribute=attribute.substring(attributePos).trim(); var enclosingChar=attribute.substring(0,1); attribute=attribute.substring(1,attribute.indexOf(enclosingChar,1)); } return attribute; } // Create complexType Output file. fs.writeFile(complexTypeFile,'ComplexType\n', function(err){ if(err) throw err; }); // Read and process the xsdFile fs.readFile(xsdFile, 'utf8', function(err, contents){ //console.log(contents); var posStartComplexType = contents.indexOf(complexTypeStartTag); while (posStartComplexType > -1){ // Abstract complexType declaration var posEndComplexType= contents.indexOf(">", posStartComplexType); console.log("Pos: ".concat(posStartComplexType, "-", posEndComplexType)); var complexType= contents.substring(posStartComplexType, posEndComplexType+1); // Log the complexType console.log("Complex type: [".concat(complexType,"]")); var typeName = getAttributeValue(complexType, "name") if (typeName==""){ typeName="embedded"; } console.log(typeName); fs.appendFileSync(complexTypeFile, typeName.concat("\n")); //Move on to find next possible complexType contents=contents.substring(posEndComplexType+1); posStartComplexType = contents.indexOf(complexTypeStartTag); } }); console.log('Done with '+xsdFile);
It parses the arguments, where it expects first a reference to the XSD file to parse, and as a second argument the filename to write all the names to.
The function getAttributeValue() finds an attribute from the provided element, based on the attributeName and returns its value if found. Otherwise it will return an empty string.
The main script will first write a header row to the output csv file. Then reads the xsd file asynchronously (there for the done message will be shown before the console logs from the processing of the file), and in finds every occurence of the xsd:complexType from the contents. When found, it will find the end of the start tag declaration and within it it will find the name attribute. This name attribute is then appended (synchronously) to the csv file.
How to read a file I found here. Appending a file here on stackoverflow.
No comments:
Post a Comment