%XML.Reader
Hi guys,
I need help because I have no idea how to proceed further and documentation does not explaining this solution.
I have XML like this:
<?xml version="1.0"?>
<ProductionPackage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" JobName="10006_8046_L69">
<Barcode>1200002101</Barcode>
<DueDate>31.12.5000 23:59:59</DueDate>
<BasicMaterial>1.0038</BasicMaterial>
<RawMaterial>St37-120</RawMaterial>
<RawMaterialThicknessUnit>mm</RawMaterialThicknessUnit>
<JobNote />
<CreatedBy>stko</CreatedBy>
<ChangedBy>stko</ChangedBy>
<Workplace WorkplaceName="TruLaser 3030 (L49)">
<Barcode>0800000029</Barcode>
<CostCenter />
<Activity>2D-Tafelbearbeitung</Activity>
<MachineName>L49</MachineName>
<MachineType>51</MachineType>
<ControlName>Sin 840D</ControlName>
<ControlType>1</ControlType>
<ProcessingAreaX>3000.00</ProcessingAreaX>
<ProcessingAreaY>1500.00</ProcessingAreaY>
<ProcessingAreaZ>115.00</ProcessingAreaZ>
</Workplace>
Im trying to read all nodes within %XML.Reader and Correlate. For parents it's not problem and I can get it. But I have no idea what to do if I want get Workplace with all his childs.
Class dhr.production.article.xml.productionPackage Extends (%Persistent, %XML.Adaptor) { Parameter XMLNAME = "ProductionPackage"; Property Barcode As %Integer; Property DueDate As %String; Property BasicMaterial As %Float; Property RawMaterial As %String; Property Workplace As dhr.production.article.xml.workplace; }
Class dhr.production.article.xml.workplace Extends (%Persistent, %XML.Adaptor) { Parameter XMLNAME = "Workplace"; Property Barcode As %Integer; Property MachineName As %String; Property MachineType As %String; Property ControlName As %String; Property ControlType As %Integer; }
For writing values from parrent it working fine, but in documentation there is no mention how I can get output from childrens and siblings. I tried object.Workplace.Barcode but does not work at all.
ClassMethod getFiles(pDir As %String, pFileSpec As %String) { SET tRS = ##class(%ResultSet).%New("%Library.File:FileSet"), tSC = tRS.Execute(pDir,pFileSpec) WHILE tRS.Next() { SET filePath = tRS.Get("Name"), lastModified = tRS.Get("DateModified"), fileType = tRS.Get("Type") SET xmlReader = ##class(%XML.Reader).%New(), xmlStatus = xmlReader.OpenFile(filePath) DO xmlReader.Correlate("ProductionPackage", "dhr.production.article.xml.productionPackage") DO xmlReader.Next(.object, .xmlStatus) WRITE !,object.Barcode } QUIT }
Check xmlStatus, it's an error:
ERROR #6237: Unexpected tag in XML input: RawMaterialThicknessUnit (ending at line 7 character 29).
You need to either specify all properties or define this parameter in both classes:
Parameter XMLIGNOREINVALIDTAG = 1;
I have generated classes now by using XML Schema, but still not working
Also im still not able access all values for example : object.LaserTechnoTables.MaxLaserPower
XML import must end successfully before you can access parsed object.
As the error states, do you have TruLaser.Order class and is it compiled?
Was not compiled even I have clicked to compile. Anyway still getting erro. Is it possible to turn off datatype validation?
I have tried replace %xsd.short for %String, %GlobalCharacterStream but does not help at all
After you compiled
Property PartoNo As %String;
what error are you getting?
Same as before
Okay and how does the XML look like?
like this: https://mega.nz/#!YNUDUQzK!aVkGBhVizEysbox1rEBmGtKhweeRrQst7-M0Ty6sUmU
PartoNo is present thrice in your XML so you should correspondingly set
Property PartoNo As %String;
three times. One time it also an attribute so add XMLPROJECTION="attribute". Docs.