Добавьте XmlNode с пространством имен родительского узла в .Net - PullRequest
2 голосов
/ 28 октября 2011

Я использую XmlDocument и XmlNode для работы с XML-файлом. Скажем, я хочу добавить действительный узел с именем «Language» в корень, я использую такой код:

Dim languageNode As XmlNode = xmlDoc.CreateNode(XmlNodeType.Element, "Language", Nothing)
languageNode.InnerText = "en-US"
root.AppendChild(languageNode)

где xmlDoc является объектом XmlDocument и уже загружен. Однако в xml-файле после операции он выглядит примерно так:

<Language xmlns="">en-US</Language>

И это не проходит проверку. Есть ли способ избавиться от пространства имен? Спасибо!

Обновление: Я редактирую файл .rdlc, который определяет локальный отчет, и использую формат xml. Часть файла выглядит так:

<?xml version="1.0" encoding="utf-16"?>
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition" 
xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

<Language xmlns="">en-US</Language>
...

Обычно не должно быть так много используемых пространств имен, но я генерирую его из xslt. Но узел языка добавляется после создания этого файла. Мой код выглядит так:

Dim xmlRdlc As New XmlDocument()
xmlRdlc.Load(file)    
Dim root As XmlNode = xmlRdlc.DocumentElement()
Dim languageNode As XmlNode = xmlRdlc.CreateNode(XmlNodeType.Element, "Language", Nothing)
languageNode.InnerText = "en-US"
root.AppendChild(languageNode)
xmlRdlc.Save(file)

Итак, как мне сделать, чтобы добавить нужный узел следующим образом:

<Language>en-US</Language>

1 Ответ

3 голосов
/ 28 октября 2011

Вам необходимо указать пространство имен.Передайте "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition" в качестве последнего параметра метода.

Dim xmlRdlc As New XmlDocument()
xmlRdlc.Load(file)    
Dim root As XmlNode = xmlRdlc.DocumentElement()
Dim languageNode As XmlNode = xmlRdlc.CreateNode(XmlNodeType.Element, "Language", _
    "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition")
languageNode.InnerText = "en-US"
root.AppendChild(languageNode)
xmlRdlc.Save(file)

Кстати, это было бы чище, если использовать LINQ to XML:

Dim rdlcNS As XNamespace = "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition"
Dim xmlRdlc = XDocument.Load(file)
xmlRdlc.Root.Add(New XElement(rdlcNS + "Language", "en-US"))
xmlRdlc.Save(file)

(перевод в VB.NET приблизительно,Ваш пробег может варьироваться и т. д.)

...