Uzavření Xml elementu   zodpovězená otázka

VB.NET, XML

Dobrý den,

vytvářím xml dokument pomocí DOM v .NET 2.0.

Zákazník si přeje, aby prázdné elementy vypadaly např. takto:

<Tool position="1"></Tool>

element vytvořím př.:

dim xe as xmlElement = xdoc.createElement("Tool")

attribut také přidám bez problémů.

Problém je, že pokud nedám nic do xe.innerText, nebo tam dám string.empty, "". Tak se element zobrazí takto:

<Tool position="1"/>

Někde jsem kdysi četl co se má innertextu elementu napsat, aby se tag uzavřel v celém tvaru. Bohužel si to nepamatuji a nedaří se mi to nějak najít.

Věděl by někdo ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Toto by sa dalo spraviť pomocou T4 šablon, nedávno o tom p. Herceg napísal článok. Neviem ako to je s podporou pre VS 2008, ale v článku spomínaný editor Tangible T4 je aj pre VS 2008 Standard, resp. vyššiu edíciu .

Taktiež, či nepomôže pridať do XmlElement novú XmlNode s NodeType=XmlNodeType.Text a do nej dať text "" .

V najhoršiom prípade by to šlo aj cez StreamWritter, ale to sa vôbec neodporúča, je to čisto krajné riešenie.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A zkoušel jste tam dát String.Empty?

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Ja som tam dal String.Empty a fungovalo to

Module Module1

    Sub Main()
        Dim doc As Xml.XmlDocument = New Xml.XmlDocument
        Dim e = doc.CreateElement("Tool")
        Dim a = doc.CreateAttribute("Position")
        a.Value = "1"
        e.Attributes.Append(a)
        doc.AppendChild(e)
        e.InnerText = String.Empty
        doc.WriteTo(New Xml.XmlTextWriter(Console.Out))
        Console.ReadLine()
    End Sub

End Module

A výstup z konzoly:

<Tool Position="1"></Tool>

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Teď jsem zkusil:

     Dim xmlDoc As New XmlDocument

        With xmlDoc

            .AppendChild(.CreateProcessingInstruction("xml", "version=""1.0"" encoding=""utf-8"""))
            .AppendChild(.CreateElement("Tools"))

            Dim xn As XmlElement = .CreateElement("Tool")
            Dim atrPos As XmlAttribute = .CreateAttribute("position")
            atrPos.InnerText = 1

            xn.Attributes.Append(atrPos)
            xn.InnerText = String.Empty

            .DocumentElement.AppendChild(xn)

            .Save("d:\test.xml")
        End With

Výsledkem je zrácený zápis.

Asi dám na pana Hercega a zkusím zatlačit na zákazníka, i když to je v tomhle případě trochu škoda. Zdá se to jako malinkatý detail, s obtížnějším řešením :-).

Ještě se zkusím podívat do chytrých knih.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ještě můžete vytvořit XML pomocí přímého zápisu bez použití třídy XmlDocument:

Dim doc = <Tool Position="1"></Tool>
doc.Save("C:\Data.xml")

To funguje bez problémů a za "1" lze i dosazovat libovolné hodnoty z proměnných:

Dim index = 1
Dim doc = <Tool Position=<%= index %>>
            <%= Me.Location.ToString() %>
          </Tool>
doc.Save("C:\Data.xml")

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Tohle je super technologie ve VB, mimo jiné ho proto používám, bohužel v .net 2.0 není linq a xml literály nejdou zapisovat přímo, tahle vymoženost je myslím až od .net 3.0.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mimochodom, nie je v LINQ možnosť zapisovať do xml literálu fragmenty kódu , ako napr. cykly, tak ako sa to dá pri T4 šablonách?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zápis

<Tool position="1"></Tool>

je ekvivalentní zápisu

<Tool position="1"/>

.

Tyto zápisy jsou naprosto stejné a pokud si zákazník nepsal XML parser sám, bude mu to fungovat.

Pokud zákazník tvrdí, že to tak není a trvá na jedné z variant, ať už z toho či onoho důvodu, poslal bych ho do prčic.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback