2011-06-25 10 views
14

Próbuję utworzyć dokument XML GPX przez LINQ na XML.Utwórz dokument XML przez LINQ, dodaj xmlns, xmlns: xsi do niego

Wszystko działa świetnie, z wyjątkiem dodawania atrybutów xmlns, xmlns: xsi do dokumentu. Próbując tego inaczej, dostaję różne wyjątki.

Mój kod:

XDocument xDoc = new XDocument(
new XDeclaration("1.0", "UTF-8", "no"), 
new XElement("gpx", 
new XAttribute("creator", "XML tester"), 
new XAttribute("version","1.1"), 
new XElement("wpt", 
new XAttribute("lat","7.0"), 
new XAttribute("lon","19.0"), 
new XElement("name","test"), 
new XElement("sym","Car")) 
)); 

Wyjście powinno zawierać także ten:

xmlns="http://www.topografix.com/GPX/1/1" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd" 

Jak mogę dodać go przez Linq do XML? Próbowałem na kilka sposobów, ale to nie działa, wyjątki podczas kompilacji.

Odpowiedz

22

Zobacz How to: Control Namespace Prefixes. Można użyć kodu:

XNamespace ns = "http://www.topografix.com/GPX/1/1"; 
XNamespace xsiNs = "http://www.w3.org/2001/XMLSchema-instance"; 
XDocument xDoc = new XDocument(
    new XDeclaration("1.0", "UTF-8", "no"), 
    new XElement(ns + "gpx", 
     new XAttribute(XNamespace.Xmlns + "xsi", xsiNs), 
     new XAttribute(xsiNs + "schemaLocation", 
      "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"), 
     new XAttribute("creator", "XML tester"), 
     new XAttribute("version","1.1"), 
     new XElement(ns + "wpt", 
      new XAttribute("lat","7.0"), 
      new XAttribute("lon","19.0"), 
      new XElement(ns + "name","test"), 
      new XElement(ns + "sym","Car")) 
)); 

Musisz podać nazw dla każdego elementu, ponieważ to właśnie w ten sposób za pomocą xmlns znaczy.

+0

Szukałem właśnie dla tego "xsi: schemaLocation". Dziękuję Ci! –

10

Od http://www.falconwebtech.com/post/2010/06/03/Adding-schemaLocation-attribute-to-XElement-in-LINQ-to-XML.aspx:

Aby wygenerować następujący węzeł główny i przestrzenie nazw:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:SchemaLocation="http://www.foo.bar someSchema.xsd" 
xmlns="http://www.foo.bar" > 
</root> 

użyć następującego kodu:

XNamespace xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance"); 
XNamespace defaultNamespace = XNamespace.Get("http://www.foo.bar"); 
XElement doc = new XElement(
    new XElement(defaultNamespace + "root", 
    new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName), 
    new XAttribute(xsi + "schemaLocation", "http://www.foo.bar someSchema.xsd") 
    ) 
); 

mieć świadomość - jeśli chcesz dodać elementy do dokument, musisz określić domyślny obszar nazw w nazwie elementu lub otrzymasz xmlns = "" dodany do Twojego elementu. Na przykład, aby dodać element podrzędny "count" do powyższego dokumentu, przeznaczenie:

xdoc.Add(new XElement(defaultNamespace + "count", 0) 
Powiązane problemy