从保存的文件中原始对象和XML之间的XML命名空间的意外处理 [英] Unexpected handling of XML namespace between original object and XML from its saved file

查看:62
本文介绍了从保存的文件中原始对象和XML之间的XML命名空间的意外处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

创建XmlDocument对象并创建XML后,我可以使用.SelectNodes方法从原始对象中取回节点,方法是不在节点名前加上命名空间前缀。如果我使用前缀,我什么也得不到。但是当我保存XML文档并重新加载它时。我得到相反的效果。使用前缀获取结果时,不使用前缀不返回任何内容。任何人都可以帮我理解并建议正确的方法。



我在VB中附加了一些测试代码;

After creating a XmlDocument object and creating XML, I can use the .SelectNodes method to get back the nodes from the original object by not prefixing the node names with the namespace prefix. I get nothing if I use the prefix. However when I save the XML document, and reload it. I get the reverse effect. Not using the prefix returns nothing while using the prefix gets results. Can anyone help me understanding here and suggest the correct way.

I have attached some test code here in VB;

Dim Root As XmlElement = Xdoc.DocumentElement
 Dim xmldecl As XmlDeclaration
 xmldecl = Xdoc.CreateXmlDeclaration("1.0", "UTF-8", Nothing)
 Xdoc.InsertBefore(xmldecl, Root)

 Dim BooksNode As XmlNode
 BooksNode = Xdoc.CreateNode(XmlNodeType.Element, "Books", "")
 Dim Attrib As XmlAttribute = Xdoc.CreateAttribute("xmlns")
 Attrib.Value = "http://www.Company.com.au/xml"
 BooksNode.Attributes.Append(Attrib)
 Xdoc.AppendChild(BooksNode)

 Dim BookNode As XmlNode
 BookNode = Xdoc.CreateNode(XmlNodeType.Element, "Book", "")
 BookNode.InnerText = ""
 BooksNode.AppendChild(BookNode)

 Dim BookNameNode As XmlNode
 BookNameNode = Xdoc.CreateNode(XmlNodeType.Element, "BookName", "")
 BookNameNode.InnerText = "Hitchhikers guide to the galaxy"
 BookNode.AppendChild(BookNameNode)

 Dim BookNode2 As XmlNode
 BookNode2 = Xdoc.CreateNode(XmlNodeType.Element, "Book", "")
 BookNode2.InnerText = ""
 BooksNode.AppendChild(BookNode2)

 Dim BookNameNode2 As XmlNode
 BookNameNode2 = Xdoc.CreateNode(XmlNodeType.Element, "BookName", "")
 BookNameNode2.InnerText = "The Power of one"
 BookNode2.AppendChild(BookNameNode2)

 Dim NsMgr As New XmlNamespaceManager(Xdoc.NameTable)
 NsMgr.AddNamespace("bk", "http://www.Company.com.au/xml")

 Dim BooksNoNsPrefix = Xdoc.SelectNodes("/Books/Book", NsMgr)
 Debug.Print("No Namespace prefix:" & BooksNoNsPrefix.Count.ToString)

 Dim BooksNsPrefix = Xdoc.SelectNodes("/bk:Books/bk:Book", NsMgr)
 Debug.Print("Using Namespace prefix:" & BooksNsPrefix.Count.ToString)

 Xdoc.Save("C:\Temp\Test.xml")
 Dim NewXdox As New XmlDocument
 NewXdox.Load("C:\Temp\Test.xml")

 Dim NsMgr2 As New XmlNamespaceManager(NewXdox.NameTable)
 NsMgr2.AddNamespace("bk", "http://www.Company.com.au/xml")

 Dim BooksNoNs2 = NewXdox.SelectNodes("/Books/Book", NsMgr2)
 Debug.Print("No Namespace prefix:" & BooksNoNs2.Count.ToString)

 Dim BooksNs2 = NewXdox.SelectNodes("/bk:Books/bk:Book", NsMgr2)
 Debug.Print("Using Namespace prefix:" & BooksNs2.Count.ToString)



输出为;


The Output is;

No Namespace prefix : 2
Using Namespace prefix : 0
No Namespace prefix : 0
Using Namespace prefix : 2

推荐答案

这是因为您没有按照自己的意愿添加命名空间。创建节点后,不要将其添加为属性,而是在创建节点时将其添加为命名空间:

It's because you're not adding your namespace as you should. Rather than add it as an attribute after you create a node, add it as the namespace when you create the node:
Dim xdoc As New XmlDocument
Dim Root As XmlElement = Xdoc.DocumentElement
Dim xmldecl As XmlDeclaration
xmldecl = xdoc.CreateXmlDeclaration("1.0", "UTF-8", Nothing)
Xdoc.InsertBefore(xmldecl, Root)

Dim BooksNode As XmlNode
Dim ns As String = "http://www.Company.com.au/xml"
BooksNode = xdoc.CreateNode(XmlNodeType.Element, "Books", ns)
xdoc.AppendChild(BooksNode)

Dim BookNode As XmlNode
BookNode = xdoc.CreateNode(XmlNodeType.Element, "Book", ns)
BookNode.InnerText = ""
BooksNode.AppendChild(BookNode)

Dim BookNameNode As XmlNode
BookNameNode = xdoc.CreateNode(XmlNodeType.Element, "BookName", ns)
BookNameNode.InnerText = "Hitchhikers guide to the galaxy"
BookNode.AppendChild(BookNameNode)

Dim BookNode2 As XmlNode
BookNode2 = xdoc.CreateNode(XmlNodeType.Element, "Book", ns)
BookNode2.InnerText = ""
BooksNode.AppendChild(BookNode2)

Dim BookNameNode2 As XmlNode
BookNameNode2 = xdoc.CreateNode(XmlNodeType.Element, "BookName", ns)
BookNameNode2.InnerText = "The Power of one"
BookNode2.AppendChild(BookNameNode2)

Dim NsMgr As New XmlNamespaceManager(xdoc.NameTable)
NsMgr.AddNamespace("bk", "http://www.Company.com.au/xml")
NsMgr.PushScope()

Dim BooksNoNsPrefix = Xdoc.SelectNodes("/Books/Book", NsMgr)
Debug.Print("No Namespace prefix:" & BooksNoNsPrefix.Count.ToString)

Dim BooksNsPrefix = Xdoc.SelectNodes("/bk:Books/bk:Book", NsMgr)
Debug.Print("Using Namespace prefix:" & BooksNsPrefix.Count.ToString)

Xdoc.Save("C:\Temp\Test.xml")
Dim NewXdox As New XmlDocument
NewXdox.Load("C:\Temp\Test.xml")

Dim NsMgr2 As New XmlNamespaceManager(NewXdox.NameTable)
NsMgr2.AddNamespace("bk", "http://www.Company.com.au/xml")

Dim BooksNoNs2 = NewXdox.SelectNodes("/Books/Book", NsMgr2)
Debug.Print("No Namespace prefix:" & BooksNoNs2.Count.ToString)

Dim BooksNs2 = NewXdox.SelectNodes("/bk:Books/bk:Book", NsMgr2)
Debug.Print("Using Namespace prefix:" & BooksNs2.Count.ToString)


这篇关于从保存的文件中原始对象和XML之间的XML命名空间的意外处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆