void AddSubelementsOfSkippedElement(TableNode parentNode, string xpath) { if (parentNode.Table.Skipped) { TableNode pparentNode = (TableNode)parentNode.UserData["parentnode"]; string path = xpath + '/' + parentNode.Name; AddSubelementsOfSkippedElement(pparentNode, path); return; //------- } CodeCompileUnit cunit = (CodeCompileUnit)parentNode.UserData["cunit"]; CodeNamespace ns = cunit.Namespaces[0]; CodeTypeDeclaration persClass = ns.Types[0]; CodeConstructor xmlConstructor = null; CodeMemberMethod xmlSaveMethod = null; foreach (CodeTypeMember member in persClass.Members) { if (member.Name == ".ctor") { CodeConstructor cc = (CodeConstructor)member; if (cc.Parameters.Count > 0) { xmlConstructor = cc; } } else if (member.Name == "Save") { CodeMemberMethod cmm = (CodeMemberMethod)member; if (cmm.Parameters.Count == 1 && cmm.Parameters[0].Type.BaseType == "XmlNode") { xmlSaveMethod = cmm; } } if (xmlConstructor != null && xmlSaveMethod != null) { break; } } /* * XmlElement subElement = parentNode.OwnerDocument.CreateElement("MyElement"); * newElement.AppendChild(subElement); * newElement = subElement; */ int p = xpath.LastIndexOf(':'); string namespc = this.namespaceWrapper[NamespaceWrapper.GetPrefixFromQualifiedName(xpath)]; string elementName = NamespaceWrapper.GetXpathFromQualifiedName(xpath); CodePrimitiveExpression myElementName = new CodePrimitiveExpression(elementName); CodePrimitiveExpression myNamespace = new CodePrimitiveExpression(namespc); CodeVariableReferenceExpression newElement = new CodeVariableReferenceExpression("myElement"); CodeVariableReferenceExpression subElement = new CodeVariableReferenceExpression("subElement"); CodeVariableReferenceExpression ownerDoc = new CodeVariableReferenceExpression("parentNode.OwnerDocument"); CodeMethodInvokeExpression createElementCall; if (namespc != null) { createElementCall = new CodeMethodInvokeExpression(ownerDoc, "CreateElement", myElementName, myNamespace); } else { createElementCall = new CodeMethodInvokeExpression(ownerDoc, "CreateElement", myElementName); } CodeVariableDeclarationStatement newElementAssign = new CodeVariableDeclarationStatement(new CodeTypeReference("XmlElement"), "subElement", createElementCall); xmlSaveMethod.Statements.Add(newElementAssign); CodeMethodInvokeExpression appendChild = new CodeMethodInvokeExpression(newElement, "AppendChild", subElement); xmlSaveMethod.Statements.Add(appendChild); CodeAssignStatement backAssign = new CodeAssignStatement(newElement, subElement); xmlSaveMethod.Statements.Add(backAssign); /* * xmlNode = xmlNode.SelectSingleNode("xpath"); */ CodeVariableReferenceExpression xmlNode = new CodeVariableReferenceExpression("xmlNode"); CodePrimitiveExpression xPathExpr = new CodePrimitiveExpression(xpath); CodeVariableReferenceExpression nsManager = new CodeVariableReferenceExpression("NamespaceManager"); CodePropertyReferenceExpression nsInstance = new CodePropertyReferenceExpression(nsManager, "Instance"); CodeMethodInvokeExpression selectNodes = new CodeMethodInvokeExpression(xmlNode, "SelectSingleNode", xPathExpr, nsInstance); CodeAssignStatement xmlNodeAssign = new CodeAssignStatement(xmlNode, selectNodes); xmlConstructor.Statements.Add(xmlNodeAssign); GenerateMembers(persClass, xmlConstructor, xmlSaveMethod); // xmlNode = xmlNode.ParentNode; CodePropertyReferenceExpression parentNodeProperty = new CodePropertyReferenceExpression(xmlNode, "ParentNode"); xmlNodeAssign = new CodeAssignStatement(xmlNode, parentNodeProperty); xmlConstructor.Statements.Add(xmlNodeAssign); // newElement = (XmlElement) newElement.ParentNode; parentNodeProperty = new CodePropertyReferenceExpression(newElement, "ParentNode"); CodeCastExpression xmlElementCast = new CodeCastExpression("XmlElement", parentNodeProperty); backAssign = new CodeAssignStatement(newElement, xmlElementCast); xmlSaveMethod.Statements.Add(backAssign); }
private void GenerateXmlLoadAndSaveCode(CodeConstructor xmlConstructor, CodeMemberMethod saveToXmlMethod, Relation relation, string foreignClassShort) { /* * XmlNodeList nodeList = xmlNode.SelectNodes("SubNodeName"); * for(int i = 0; i < nodeList.Count; i = i + 1) * { * XmlNode subNode = nodeList[i]; * this.relationField.Add(new RelatedType(subNode)); * } */ TargetLanguage targetLanguage = ApplicationController.Instance.AssemblyNode.Assembly.TargetLanguage; string xpath = null; if (relation.IsForeign) { xpath = ((ForeignFkRelation)relation).XPath; } else { throw new Exception("Internal Error 132 in RelationGenerator: Relation is not a ForeignFkRelation."); } string nodeListName = relation.FieldName + "NodeList"; CodeVariableReferenceExpression nsManager = new CodeVariableReferenceExpression("NamespaceManager"); CodePropertyReferenceExpression nsInstance = new CodePropertyReferenceExpression(nsManager, "Instance"); CodeVariableDeclarationStatement nodeListDecl = new CodeVariableDeclarationStatement("XmlNodeList", nodeListName, new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("xmlNode"), "SelectNodes", new CodePrimitiveExpression(xpath), nsInstance)); xmlConstructor.Statements.Add(nodeListDecl); CodeVariableReferenceExpression iExpr = new CodeVariableReferenceExpression("i"); CodeFieldReferenceExpression relationField = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), relation.FieldName); CodeIterationStatement forLoop = new CodeIterationStatement( new CodeAssignStatement(iExpr, new CodePrimitiveExpression(0)), new CodeBinaryOperatorExpression( iExpr, CodeBinaryOperatorType.LessThan, new CodeVariableReferenceExpression(nodeListName + ".Count")), // should work in C# and VB new CodeAssignStatement( iExpr, new CodeBinaryOperatorExpression( iExpr, CodeBinaryOperatorType.Add, new CodePrimitiveExpression(1))), new CodeVariableDeclarationStatement("XmlNode", "subNode", new CodeIndexerExpression( new CodeVariableReferenceExpression(nodeListName), iExpr)), new CodeExpressionStatement( new CodeMethodInvokeExpression(relationField, "Add", new CodeObjectCreateExpression(foreignClassShort, new CodeVariableReferenceExpression("subNode"))))); xmlConstructor.Statements.Add(forLoop); /* * for ( int i = 0; i < relatedContainer.Count; i = i + 1 ) * { * RelatedType relObject = relContainer[i]; * relObject.Save(newElement, "Elementname", "Namespace"); * } */ string elementNodeName = null; string[] xpathParts = xpath.Split('/'); if (xpath.IndexOf('/') > -1) { elementNodeName = GenerateNestedXpathCode(xpathParts, saveToXmlMethod); } else { elementNodeName = "myElement"; } string elementPath = xpathParts[xpathParts.Length - 1]; string namespc = this.namespaceWrapper[NamespaceWrapper.GetPrefixFromQualifiedName(elementPath)]; elementPath = NamespaceWrapper.GetXpathFromQualifiedName(elementPath); CodeExpression namespcExpr = new CodePrimitiveExpression(namespc); forLoop = new CodeIterationStatement( new CodeAssignStatement(iExpr, new CodePrimitiveExpression(0)), new CodeBinaryOperatorExpression( iExpr, CodeBinaryOperatorType.LessThan, new CodePropertyReferenceExpression(relationField, "Count")), new CodeAssignStatement( iExpr, new CodeBinaryOperatorExpression( iExpr, CodeBinaryOperatorType.Add, new CodePrimitiveExpression(1))), new CodeVariableDeclarationStatement(foreignClassShort, "relObject", new CodeIndexerExpression(relationField, iExpr)), new CodeExpressionStatement( new CodeMethodInvokeExpression( new CodeVariableReferenceExpression("relObject"), "Save", new CodeVariableReferenceExpression(elementNodeName), new CodePrimitiveExpression(elementPath), namespcExpr))); saveToXmlMethod.Statements.Add(forLoop); }