parser nodo node examples agregar xml dom powershell appendchild

nodo - Eliminar el atributo xmlns no deseado(vacío) agregado por appendChild



dom xml parser (4)

Se ha agregado la declaración xmlns = "" espacio de nombres (un) porque su elemento principal está en un espacio de nombres y su elemento hijo no. Si no desea que se agregue esta declaración de espacio de nombres, la implicación es que desea que el elemento hijo esté en el mismo espacio de nombres que su elemento primario, y la respuesta es colocarlo en este espacio de nombres en el momento de crear el elemento. Es decir, cambie la llamada CreateElement ("Destino", "") para especificar el espacio de nombre correcto.

Tengo este código:

function setupProject($projectFile) { [xml]$root = Get-Content $projectFile; $project = $root.Project; $beforeBuild = $root.CreateElement("Target", ""); $beforeBuild.SetAttribute("name", "BeforeBuild"); $beforeBuild.RemoveAttribute("xmlns"); $project.AppendChild($beforeBuild); $root.Save($projectFile); }

Debería agregar un nuevo <Target name="BeforeBuild" /> al documento XML.

Pero también agrega un atributo xmlns="" vacío que no quiero. (¡En realidad es Visual Studio a quien no le gusta este atributo!)

<Target name="BeforeBuild" xmlns="" />

Ya probé este código:

$beforeBuild.RemoveAttribute("xmlns"); $project.AppendChild($beforeBuild); $beforeBuild.RemoveAttribute("xmlns");


Tal como lo respondió Michael Kay , la mejor manera de eliminar este espacio de nombres no deseado es crear el nuevo elemento hijo en el mismo espacio de nombres que su elemento primario:

function setupProject($projectFile) { [xml]$root = Get-Content $projectFile; $project = $root.Project; //UPDATE THIS LINE $beforeBuild = $root.CreateElement("Target", ""); $beforeBuild = $root.CreateElement("Target", $project.NamespaceURI); $beforeBuild.SetAttribute("name", "BeforeBuild"); $beforeBuild.RemoveAttribute("xmlns"); $project.AppendChild($beforeBuild); $root.Save($projectFile); }



Usando Javascript

Si está utilizando JS para crear un documento XML y obtiene los atributos xmlns en blanco en los nodos secundarios después de declarar xmlns="XXXX" en el nodo padre, use JS createElementNS(namespace, nodeName) lugar de createElement(nodeName) .

Esto supone que desea que sus nodos secundarios compartan el mismo espacio de nombres que el padre. En el caso siguiente, ''v1'', ''v2'', etc. compartirán la NS de ''datos''

Se vería algo como esto:

let data = someArray; let nameSpace = ''XXX''; let doc = "<?xml version=''1.0'' encoding=''utf-8'' ?><data xmlns=''XXXX''></data>"; let parser = new DOMParser(); let xml = parser.parseFromString(doc, "text/xml"); for (let i = 0; i < data.length; i++) { let node = xml.createElementNS(nameSpace , "v" + (i + 1)); $(node).text(data[i]); let elements = xml.getElementsByTagName("data"); elements[0].appendChild(node); }

El resultado CORRECTO se vería así:

<?xml version=''1.0'' encoding=''utf-8'' ?> <data xmlns=''XXXX''> <v1></v1> <v2></v2> </data>

Versus resultado MALO:

<?xml version=''1.0'' encoding=''utf-8'' ?> <data xmlns=''XXXX''> <v1 xmlns=""></v1> <v2 xmlns=""></v2> </data>

Con esta solución, también podría declarar espacios de nombres separados para sus nodos secundarios. Simplemente reemplace la variable nameSpace con una cadena uri de espacio de nombres diferente u otra variable establecida.