Vra

Wanneer genereer XML uit XmlDocument in NET, 'n leë xmlns kenmerk verskyn die eerste keer 'n element sonder 'n Gekoppelde naamruimte ingesit; hoe kan dit voorkom word?

Voorbeeld:

XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root",
    "whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner"));
Console.WriteLine(xml.OuterXml);

Uitgawe:

<root xmlns="whatever:name-space-1.0"><loner xmlns="" /></root>

Gekose Uitgawe:

<root xmlns="whatever:name-space-1.0"><loner /></root>

Is daar 'n oplossing van toepassing op die XmlDocument kode, nie iets wat plaasvind na omskepping van die dokument na 'n string met OuterXml?

My redenasie om dit te doen is om te kyk of ek kan ooreenstem met die standaard XML van 'n bepaalde protokol met behulp van XmlDocument-gegenereerde XML. Die leeg xmlns kenmerk kan nie breek of verwar 'n ontleder, maar dit is ook nie teenwoordig in enige gebruik wat ek gesien het van hierdie protokol.

Was dit nuttig?

Oplossing

Dankie aan antwoord Jeremy Lew se en 'n bietjie meer rondspeel, ek uitgepluis het hoe om leeg xmlns verwyder eienskappe: slaag in naamruimte die wortel node se wanneer die skep van 'n kind node jy wil nie om 'n voorvoegsel hê op. Met behulp van 'n naamruimte sonder 'n voorvoegsel by die wortel beteken dat jy nodig het om daardie selfde naamruimte op kind elemente gebruik vir hulle om ook nie voorvoegsels het.

Vaste Kode:

XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root", "whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner", "whatever:name-space-1.0")); 
Console.WriteLine(xml.OuterXml);

Dankie almal vir al jou antwoorde wat my gelei in die regte rigting!

Ander wenke

Dit is 'n variant van antwoord JeniT se (Thank you very very much btw!)

XmlElement new_element = doc.CreateElement("Foo", doc.DocumentElement.NamespaceURI);

Dit sluit hoef te oral kopieer of herhaal die naamruimte.

As die <loner> element in jou monster XML nie die xmlns verstek naam ruimte verklaring daarop gehad het nie, dan sou dit in die whatever:name-space-1.0 naamruimte wees eerder as om in geen naamspasie. As dit is wat jy wil, wat jy nodig het om die element in die naam ruimte te skep:

xml.CreateElement("loner", "whatever:name-space-1.0")

As jy wil die <loner> element te wees in geen naamspasie, dan die XML wat al vervaardig is presies wat jy nodig het, en jy moet nie bekommerd wees oor die xmlns kenmerk wat outomaties is bygevoeg vir jou.

Sedert wortel is in 'n unprefixed naamruimte, 'n kind van wortel wat wil wees un-namespaced moet uitvoer soos jou voorbeeld wees. Die oplossing sou wees om die wortel element voorvoegsel soos so:

<w:root xmlns:w="whatever:name-space-1.0">
   <loner/>
</w:root>

kode:

XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement( "w", "root", "whatever:name-space-1.0" );
doc.AppendChild( root );
root.AppendChild( doc.CreateElement( "loner" ) );
Console.WriteLine(doc.OuterXml);

As dit moontlik is, skep 'n serialisasie klas dan doen:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer serializer = new XmlSerializer(yourType);
serializer.Serialize(xmlTextWriter, someObject, ns);

Dit is veiliger, en jy kan die naamruimtes met eienskappe te beheer as jy regtig meer beheer nodig.

Ek het die probleem opgelos deur die gebruik van die Factory patroon. Ek het 'n fabriek vir XElement voorwerpe. As parameter vir die Instantiëring van die fabriek ek 'n XNamespace voorwerp het gespesifiseer. So, elke keer 'n XElement is geskep deur die fabriek die naamruimte sal outomaties bygevoeg word. Hier is die kode van die fabriek:

internal class XElementFactory
{
    private readonly XNamespace currentNs;

    public XElementFactory(XNamespace ns)
    {
        this.currentNs = ns;
    }

    internal XElement CreateXElement(String name, params object[] content)
    {
        return new XElement(currentNs + name, content);
    }
}

Ja, jy kan verhoed dat die xmlns van die XmlElement. Eerste Skepping tyd dit kom: soos wat

<trkpt lat="30.53597" lon="-97.753324" xmlns="">
    <ele>249.118774</ele>
    <time>2006-05-05T14:34:44Z</time>
</trkpt>

Verander die kode: En slaag xml naamruimte soos hierdie

C # kode:

XmlElement bookElement = xdoc.CreateElement("trkpt", "http://www.topografix.com/GPX/1/1");
bookElement.SetAttribute("lat", "30.53597");
bookElement.SetAttribute("lon", "97.753324");
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top