在.Net中添加具有父节点名称空间的XmlNode

时间:2011-10-28 13:33:42

标签: .net xml namespaces xmlnode

我正在使用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生成的。但是在生成此文件后添加了Language节点。我的代码如下所示:

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 个答案:

答案 0 :(得分:3)

您需要指定命名空间。将“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近似,您的里程可能会有所不同等)