从保存的文件中原始对象和XML之间的XML命名空间的意外处理 [英] Unexpected handling of XML namespace between original object and XML from its saved file
问题描述
创建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屋!