@ -51639,6 +51639,8 @@ exports.validate = function (xmlData, options) {
return getErrorObject ( 'InvalidTag' , "Closing tag '" + tagName + "' doesn't have proper closing." , getLineNumberForPosition ( xmlData , i ) ) ;
} else if ( attrStr . trim ( ) . length > 0 ) {
return getErrorObject ( 'InvalidTag' , "Closing tag '" + tagName + "' can't have attributes or invalid starting." , getLineNumberForPosition ( xmlData , tagStartPos ) ) ;
} else if ( tags . length === 0 ) {
return getErrorObject ( 'InvalidTag' , "Closing tag '" + tagName + "' has not been opened." , getLineNumberForPosition ( xmlData , tagStartPos ) ) ;
} else {
const otg = tags . pop ( ) ;
if ( tagName !== otg . tagName ) {
@ -52082,6 +52084,7 @@ Builder.prototype.j2x = function(jObj, level) {
//repeated nodes
const arrLen = jObj [ key ] . length ;
let listTagVal = "" ;
let listTagAttr = "" ;
for ( let j = 0 ; j < arrLen ; j ++ ) {
const item = jObj [ key ] [ j ] ;
if ( typeof item === 'undefined' ) {
@ -52091,17 +52094,27 @@ Builder.prototype.j2x = function(jObj, level) {
else val += this . indentate ( level ) + '<' + key + '/' + this . tagEndChar ;
// val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;
} else if ( typeof item === 'object' ) {
if ( this . options . oneListGroup ) {
listTagVal += this . j2x ( item , level + 1 ) . val ;
if ( this . options . oneListGroup ) {
const result = this . j2x ( item , level + 1 ) ;
listTagVal += result . val ;
if ( this . options . attributesGroupName && item . hasOwnProperty ( this . options . attributesGroupName ) ) {
listTagAttr += result . attrStr
}
} else {
listTagVal += this . processTextOrObjNode ( item , key , level )
}
} else {
if ( this . options . oneListGroup ) {
let textValue = this . options . tagValueProcessor ( key , item ) ;
textValue = this . replaceEntitiesValue ( textValue ) ;
listTagVal += textValue ;
} else {
listTagVal += this . buildTextValNode ( item , key , '' , level ) ;
}
}
}
if ( this . options . oneListGroup ) {
listTagVal = this . buildObjectNode ( listTagVal , key , '' , level ) ;
listTagVal = this . buildObjectNode ( listTagVal , key , listTagAttr , level ) ;
}
val += listTagVal ;
} else {
@ -52911,10 +52924,18 @@ const parseXml = function(xmlData) {
let tagContent = "" ;
//self-closing tag
if ( tagExp . length > 0 && tagExp . lastIndexOf ( "/" ) === tagExp . length - 1 ) {
if ( tagName [ tagName . length - 1 ] === "/" ) { //remove trailing '/'
tagName = tagName . substr ( 0 , tagName . length - 1 ) ;
jPath = jPath . substr ( 0 , jPath . length - 1 ) ;
tagExp = tagName ;
} else {
tagExp = tagExp . substr ( 0 , tagExp . length - 1 ) ;
}
i = result . closeIndex ;
}
//unpaired tag
else if ( this . options . unpairedTags . indexOf ( tagName ) !== - 1 ) {
i = result . closeIndex ;
}
//normal tag