XmlDocumentFragment redundanter namespace Verweis

24/03/2009 - 22:28 von R. J. Staufenbiel | Report spam
Hallo Community,

ich möchte ein Teilstück aus einem XML-Dokument per XPath lokalisieren und
das Element mit seinen sàmtlichen Child Elementen an eine (auch per XPath
festgelegte) andere Stelle in ein weiteres XML-Dokument einfügen. Das ganze
klappt prinzipiell auch, allerdings wird beim im Zieldokument eingefügten
Element ein aus meiner Sicht unnötiger Verweis auf den XML-Namespace
eingetragen.

Hier mal meine Anwendung:

using System;
using System.Xml;
using System.Xml.XPath;

namespace NSPConfusion
{
class Program
{
static void Main(string[] args)
{
XPathNavigator navi = new
XPathDocument("template.xml").CreateNavigator();
XmlNamespaceManager templMgr = new
XmlNamespaceManager(navi.NameTable);
templMgr.AddNamespace("templ","http://rjs.templates");
XPathNavigator template2Insert =
navi.SelectSingleNode("templ:templates/templ:template[@id='2']", templMgr);
string insertLocation =
template2Insert.GetAttribute("targetPath", string.Empty);
string part2Insert = template2Insert.InnerXml;

XmlDocument targetDoc = new XmlDocument();
targetDoc.Load("target.xml");
XmlNamespaceManager targMgr = new
XmlNamespaceManager(targetDoc.NameTable);
targMgr.AddNamespace("targ", "http://rjs.target");

XmlNode nodePointOfInsertion =
targetDoc.SelectSingleNode(insertLocation, targMgr);

XmlDocumentFragment fragment = targetDoc.CreateDocumentFragment();

fragment.InnerXml = part2Insert;
nodePointOfInsertion.AppendChild(fragment);

targetDoc.Save("out.xml");

}
}
}

Und hier das Dokument, aus dem Teile kopiert werden sollen:

<?xml version="1.0" encoding="utf-8" ?>
<templates xmlns="http://rjs.templates">
<template id="1" targetPath="/targ:targetFile/targ:target1">
<someContent xmlns="http://rjs.target">
<element1>foo</element1>
<element2>foo</element2>
</someContent>
</template>
<template id="2" targetPath="/targ:targetFile/targ:target1">
<someContent xmlns="http://rjs.target">
<element1>bar</element1>
<element2>bar</element2>
</someContent>
</template>
</templates>

und hier das Dokument, in das die Teilstücke kopiert werden sollen:

<?xml version="1.0" encoding="utf-8" ?>
<targetFile xmlns="http://rjs.target">
<target1></target1>
<target2></target2>
</targetFile>

Das Ergebnisdokument ("out.xml") hat folgendes Aussehen:

<?xml version="1.0" encoding="utf-8"?>
<targetFile xmlns="http://rjs.target">
<target1>
<someContent xmlns="http://rjs.target">
<element1>bar</element1>
<element2>bar</element2>
</someContent>
</target1>
<target2>
</target2>
</targetFile>

Hier ist aus meiner Sicht die Angabe des xmlns-Attributs beim Element
"someContent" nicht notwendig, weil im übergeordneten Knoten bereits erfolgt
und sollte unterbleiben.

Wenn ich die Namespace-Angabe im Template wo sie aber hin muss, weil es ja
explizit Elemente aus dem anderen Namensraum sein sollen, weglasse, wird
(richtiger Weise) der namespace des Template-Dokumentes referenziert.:

<?xml version="1.0" encoding="utf-8"?>
<targetFile xmlns="http://rjs.target">
<target1>
<someContent xmlns="http://rjs.templates">
<element1>bar</element1>
<element2>bar</element2>
</someContent>
</target1>
<target2>
</target2>
</targetFile>

Alle Tipps, wie ich die nicht notwendige (redundante) namespace-Angabe
vermeiden kann sind very welcome.

Thanx-a-lot in advance

RJ
 

Lesen sie die antworten

#1 Martin Honnen
25/03/2009 - 15:14 | Warnen spam
R. J. Staufenbiel wrote:
Hallo Community,

ich möchte ein Teilstück aus einem XML-Dokument per XPath lokalisieren und
das Element mit seinen sàmtlichen Child Elementen an eine (auch per XPath
festgelegte) andere Stelle in ein weiteres XML-Dokument einfügen. Das ganze
klappt prinzipiell auch, allerdings wird beim im Zieldokument eingefügten
Element ein aus meiner Sicht unnötiger Verweis auf den XML-Namespace
eingetragen.



Siehe Antwork in microsoft.public.dotnet.xml


Martin Honnen MVP XML
http://JavaScript.FAQTs.com/

Ähnliche fragen