Настройка пространств имен XML с помощью API System.Xml.Linq
У меня проблемы с генерацией XML в соответствии с этим:
<Root xmlns:brk="http://somewhere">
<child1>
<brk:node1>123456</brk:node1>
<brk:node2>500000000</brk:node2>
</child1>
</Root>
Этот код дает мне большую часть пути, но я не могу получить пространство имен 'brk' перед узлами;
var rootNode = new XElement("Root");
rootNode.Add(new XAttribute(XNamespace.Xmlns + "brk", "http://somewhere"));
var childNode = new XElement("child1");
childNode.Add(new XElement("node1",123456));
rootNode.Add(childNode);
Я пробовал это:
XNamespace brk = "http://somewhere";
childNode.Add(new XElement(brk+"node1",123456));
и это
XNamespace brk = "http://somewhere";
childNode.Add(new XElement("brk:node1",123456));
но оба вызывают исключения.
3 ответа
Вы почти у цели, но в первом примере кода вы допустили одну простую ошибку. Я считаю, что это то, что вам нужно:
XNamespace brk = "http://somewhere.com";
XElement root = new XElement("Root",
new XAttribute(XNamespace.Xmlns + "brk", "http://somewhere.com"));
XElement childNode = new XElement("child1");
childNode.Add(new XElement(brk + "node1",123456));
root.Add(childNode);
Главное отличие здесь в том, куда я добавляю node1
в childNode
следующее:
childNode.Add(new XElement(brk + "node1",123456));
Этот код, учитывая XmlWriter
а также XDocument
дает мне вывод:
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:brk="http://somewhere.com">
<child1>
<brk:node1>123456</brk:node1>
</child1>
</Root>
Смотрите MSDN для получения подробной информации об использовании XNamespace
,
Это solotuion и работает нормально.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;
using System.Xml.Serialization;
namespace CreateSampleXML
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
XNamespace xm = "http://somewhere.com";
XElement rt= new XElement("Root", new XAttribute(XNamespace.Xmlns + "brk", "http://somewhere.com"));
XElement cNode = new XElement("child1");
cNode.Add(new XElement(xm + "node1", 123456));
cNode.Add(new XElement(xm + "node2", 500000000));
rt.Add(cNode);
XDocument doc2 = new XDocument(rt);
doc2.Save(@"C:\sample3.xml");
}
}
}
Я считаю, что проблема в том, что корневой элемент должен иметь пространство имен:
XElement root = new XElement("Root",
new XAttribute(XNamespace.Xmlns + "brk", "http://somewhere.com"));
должно быть:
XElement root = new XElement(brk + "Root",
new XAttribute(XNamespace.Xmlns + "brk", "http://somewhere.com"));