Создайте документ XML с помощью LINQ, добавьте в него xmlns, xmlns: xsi - PullRequest
14 голосов
/ 26 июня 2011

Я пытаюсь создать документ GPX XML с помощью LINQ to XML.

Все отлично работает, кроме добавления атрибутов xmlns, xmlns: xsi в документ. Пытаясь по-другому, я получаю разные исключения.

Мой код:

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"))
));

Вывод также должен содержать это:

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"

Как я могу добавить его с помощью Linq в XML? Я пробовал несколько способов, но это не работает, исключения во время компиляции.

Ответы [ 2 ]

23 голосов
/ 26 июня 2011

См. Как: управлять префиксами пространства имен . Вы можете использовать код, подобный этому:

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"))
));

Вы должны указать пространство имен для каждого элемента, потому что это означает, что использование xmlns означает этот путь.

10 голосов
/ 26 июня 2011

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

Для создания следующего корневого узла и пространств имен:

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

Используйте следующий код:

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")
    )
);

Имейте в виду - если выЕсли вы хотите добавить элементы в документ, вам нужно указать defaultNamespace в имени элемента, иначе вы добавите xmlns = "" в ваш элемент.Например, чтобы добавить дочерний элемент «count» в вышеуказанный документ, используйте:

xdoc.Add(new XElement(defaultNamespace + "count", 0)
...