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:

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

element vytvořím př.:

1
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:

1
<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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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:

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

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

Teď jsem zkusil:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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:

1
2
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:

1
2
3
4
5
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

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

je ekvivalentní zápisu

1
<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

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