Создайте XML-документ LINQ, добавьте xmlns, xmlns: xsi к нему
Я пытаюсь создать XML-документ GPX с помощью 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? Я пробовал несколько способов, но он не работает, исключения во время компиляции.
Ответы
Ответ 1
См. Как использовать префиксы пространства имен. Вы можете использовать такой код:
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
.
Ответ 2
Из http://www.falconwebtech.com/post/2010/06/03/Adding-schemaLocation-attribute-to-XElement-in-LINQ-to-XML.aspx:
Чтобы создать следующий корень node и пространства имен:
<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")
)
);
Знайте - если вы хотите добавить элементы в документ, вам нужно указать пространство имен по умолчанию в имени элемента или вы получите xmlns = ", добавленный в ваш элемент. Например, чтобы добавить дочерний элемент" count" к вышеуказанному документу, используйте:
xdoc.Add(new XElement(defaultNamespace + "count", 0)