git-svn-id: http://svn.calculate.ru/calculate2/calculate-lib/trunk@21 c91db197-33c1-4113-bf15-f8a5c547ca64

develop
asamoukin 16 years ago
parent 255fc19922
commit 8508a277ba

@ -523,6 +523,8 @@ class xmlDoc:
self.tmpFields = False
# Разделитель областей - по умолчанию перевод строки "\n"
self.sepAreas = False
# Разделитель разделенных списков - по умолчанию перевод строки "\n"
#self.sepSplitFields = False
def createDoc(self, typeDoc, version):
@ -536,6 +538,8 @@ class xmlDoc:
self.body = xpath.Evaluate('child::body',self.root)[0]
# установка разделителя областей
self.sepAreas = self.createField("br",[],"",[],False,False)
# установка разделителя областей разделенных списков
#self.sepSplitFields = self.createField("br",[],"",[],False,False)
return self.doc
def addField(self, field):
@ -621,13 +625,17 @@ class xmlDoc:
xmlCaptions[0].appendChild(newNode)
def joinField(self, xmlArea, xmlNewField):
def joinField1(self, xmlArea, xmlNewField):
print "----------------------------------------------------"
#print self.getQuoteField(xmlNewField)
"""Объединяет XML ноду область и XML ноду поле"""
fieldNames = xpath.Evaluate('child::field/name',xmlArea)
newFieldNames = xpath.Evaluate('child::name',xmlNewField)
newFieldVals = xpath.Evaluate('child::value',xmlNewField)
newFieldsAction = self.getActionField(xmlNewField)
flagFindField = False
flagGlobalCompareFields = False
appSplLst = []
if not newFieldNames:
return False
newNameField = newFieldNames[0].firstChild.nodeValue
@ -657,6 +665,11 @@ class xmlDoc:
flagNoCompareFields = True
break
z += 1
if not flagNoCompareFields:
flagGlobalCompareFields = True
print "FLAG", flagGlobalCompareFields
if flagNoCompareFields or\
self.getTypeField(xmlNewField) == "seplist":
#Действия при добавлении распределенного списка
@ -664,50 +677,166 @@ class xmlDoc:
xmlOldField = fn.parentNode
seplistNewXML = self.getSepListToField(xmlNewField)
seplistOldXML = self.getSepListToField(xmlOldField)
#print seplistOldXML
if not seplistOldXML:
seplistOldXML = [xmlOldField,]
xmlAreaOld = xmlOldField.parentNode
for nodeSeplistRemove in seplistOldXML[:-1]:
if nodeSeplistRemove.nextSibling and\
self.getTypeField(\
nodeSeplistRemove.nextSibling) == "br":
xmlAreaOld.removeChild(\
nodeSeplistRemove.nextSibling)
if self.getTypeField(nodeSeplistRemove) == "var":
xmlAreaOld.removeChild(nodeSeplistRemove)
if nodeSeplistRemove.nextSibling and\
self.getTypeField(\
nodeSeplistRemove.nextSibling) == "br":
xmlAreaOld.removeChild(\
nodeSeplistRemove.nextSibling)
for nodeSeplist in seplistNewXML:
if self.getActionField(nodeSeplist) != "drop":
#xmlArea.appendChild(nodeSeplist.cloneNode(\
#True))
xmlArea.insertBefore(nodeSeplist.cloneNode(\
True), seplistOldXML[-1])
if newFieldsAction == "join":
self.setActionField(nodeSeplist,"append")
nextNode = seplistOldXML[-1].nextSibling
newInsNode = nodeSeplist.cloneNode(True)
if nextNode:
appSplLst.append((newInsNode,
nextNode,
"insert"))
else:
appSplLst.append((newInsNode,
False,
"append"))
else:
xmlArea.insertBefore(\
nodeSeplist.cloneNode(True),
seplistOldXML[-1])
parentNode = nodeSeplist.parentNode
parentNode.removeChild(nodeSeplist)
if seplistNewXML:
parentNode = seplistOldXML[-1].parentNode
if parentNode:
if parentNode and newFieldsAction != "join":
parentNode.removeChild(seplistOldXML[-1])
#print "--------------------------------------"
#print nodeSeplist.toprettyxml()
#xmlArea.removeChild(fn.parentNode)
else:
#print xmlNewField.toprettyxml()
# Устанавливаем action=replace
self.setActionField(xmlNewField, "replace")
# Если параметры поля не сходятся заменяем поле
xmlArea.replaceChild(xmlNewField.cloneNode(True),
fn.parentNode)
# Если поле не найдено добавляем его
fn.parentNode)
print "FLAG-FLAG", flagGlobalCompareFields
if not flagGlobalCompareFields:
print xmlNewField.toprettyxml()
for newNode, nxtNode, app in appSplLst:
if app == "insert":
pass
xmlArea.insertBefore(newNode,nxtNode)
elif app == "append":
pass
xmlArea.appendChild(newNode)
#print newNode, nextNode, app
#
#if newFieldsAction == "join":
#self.setActionField(xmlNewField,"append")
#xmlArea.appendChild(xmlNewField)
#return True
# Если поле не найдено добавляем его
if not flagFindField:
if self.getActionField(xmlNewField) != "drop":
self.setActionField(xmlNewField, "append")
xmlArea.appendChild(xmlNewField)
return True
def joinField(self, xmlArea, xmlNewField):
newNameField = self.getNameField(xmlNewField)
if not newNameField or not newNameField.strip():
return False
fieldsOldComp = xpath.Evaluate("child::field[child::name='%s']"\
%(newNameField), xmlArea)
# Если поле не найдено добавляем его
typeNewField = self.getTypeField(xmlNewField)
if not fieldsOldComp and typeNewField != "seplist":
if self.getActionField(xmlNewField) != "drop":
self.setActionField(xmlNewField, "append")
xmlArea.appendChild(xmlNewField)
return True
newFieldsAction = self.getActionField(xmlNewField)
newValues = self.getFieldValues(xmlNewField)
print newValues
flagCompare = True
for nodeFieldOld in fieldsOldComp:
oldValues = self.getFieldValues(nodeFieldOld)
for newValue in newValues:
if not (newValue in oldValues):
flagCompare = False
break
appSplLst = []
if typeNewField == "seplist":
xmlOldField = fieldsOldComp[-1]
seplistNewXML = self.getSepListToField(xmlNewField)
if seplistNewXML:
for nodeSeplist in seplistNewXML:
if self.getActionField(nodeSeplist) != "drop":
if newFieldsAction == "join":
self.setActionField(nodeSeplist,"append")
nextNode = xmlOldField.nextSibling
newInsNode = nodeSeplist.cloneNode(True)
if nextNode:
appSplLst.append((newInsNode,
nextNode,
"insert"))
else:
appSplLst.append((newInsNode,
False,
"append"))
else:
xmlArea.insertBefore(\
nodeSeplist.cloneNode(True),
xmlOldField)
parentNode = nodeSeplist.parentNode
parentNode.removeChild(nodeSeplist)
parentNode = xmlOldField.parentNode
if parentNode and newFieldsAction != "join":
parentNode.removeChild(xmlOldField)
for newNode, nxtNode, app in appSplLst:
print newNode, nxtNode, app
if app == "insert":
xmlArea.insertBefore(newNode,nxtNode)
elif app == "append":
xmlArea.appendChild(newNode)
if not flagCompare and typeNewField != "seplist":
# Устанавливаем action=replace
self.setActionField(xmlNewField, "replace")
# Если параметры поля не сходятся заменяем поле
xmlArea.replaceChild(xmlNewField.cloneNode(True),
fieldsOldComp[-1])
print "-------------------------------------------------------"
if newFieldsAction == "join":
fieldsOldRemove = []
else:
fieldsOldRemove = fieldsOldComp[:-1]
for nodeFieldOld in fieldsOldRemove:
print nodeFieldOld.toprettyxml()
if self.getActionField(nodeFieldOld) != 'append':
xmlArea.removeChild(nodeFieldOld)
if nodeFieldOld.nextSibling and\
self.getTypeField(nodeFieldOld.nextSibling) == "br":
xmlArea.removeChild(nodeFieldOld.nextSibling)
return True
def getSepListToField(self, xmlField):
"""Выдает элементы распределенного массива
@ -739,9 +868,14 @@ class xmlDoc:
parentNode.removeChild(fieldNode)
else:
print self.getActionField(fieldNode)
if self.getActionField(fieldNode) != "drop" or\
self.getActionField(fieldNode) != "join":
if self.getActionField(fieldNode) == "drop":
pass
elif self.getActionField(fieldNode) == "join":
pass
else:
self.setActionField(fieldNode,"append")
print "#"
print self.getActionField(fieldNode)
@ -751,8 +885,17 @@ class xmlDoc:
xmlNewAreas = xpath.Evaluate('child::area',newBody)
for xmlNewArea in xmlNewAreas:
self.joinArea(baseBody,xmlNewArea)
removeNodesDict = {}
notRemoveNodesDict = {}
joinNewFields = xpath.Evaluate("child::field[child::action='join']"
,newBody)
for notRemNode in joinNewFields:
nameField = self.getNameField(notRemNode)
if not notRemoveNodesDict.has_key(nameField):
notRemoveNodesDict[nameField] = []
notRemoveNodesDict[nameField].append(notRemNode)
else:
notRemoveNodesDict[nameField].append(notRemNode)
notSepListField = []
sepListField = []
for nField in newFields:
@ -762,7 +905,9 @@ class xmlDoc:
else:
if self.getNameField(nField):
notSepListField.append(nField)
for name in notRemoveNodesDict.keys():
if removeNodesDict.has_key(name):
removeNodesDict[name] = []
for removeNodes in removeNodesDict.values():
if removeNodes:
if self.getTypeField(removeNodes[-1]) == "seplist":
@ -774,9 +919,9 @@ class xmlDoc:
baseBody.removeChild(removeNode)
for node in sepListField:
#if removeNodes:
node.setAttribute("type", "seplist")
self.setActionField(node,"insert")
if self.getActionField(node) != "join":
self.setActionField(node,"insert")
self.joinField(baseBody, node)
#else:
#self.setActionField(node, "append")
@ -937,7 +1082,6 @@ class xmlDoc:
# Перед объединение области с документом
# удаляем комментарии
self.removeComment(newImportBodyNode)
#print newImportBodyNode.toprettyxml()
self.joinBody(self.body, newImportBodyNode)
# расставляем BR
self.insertBRtoBody(self.body)
@ -1027,6 +1171,15 @@ class xmlDoc:
else:
return False
def getFieldValues(self, xmlField):
"""Выдает значения XML поля в виде массива"""
vals = []
xmlValues = xpath.Evaluate('child::value',xmlField)
if xmlValues:
for node in xmlValues:
vals.append(node.firstChild.nodeValue)
return vals
def getActionArea(self, xmlArea):
"""Выдает свойство action XML области"""
xmlActions = xpath.Evaluate('child::caption/action',xmlArea)

Loading…
Cancel
Save