我必须在特定位置的XML文件中插入数据。例如:
<tag1>
<tag2>
<tag3>data</tag3>
</tag2>
<tag2>
<tag3>data2</tag3>
</tag2>
</tag1>
我必须使用DOM找到'data2'而不是返回并在其中包含'data2'的'tag2'中插入新元素。更具体地说,我正在编写一个获取参数的函数:搜索键和要插入的数据。
我怎样才能找到'data2'以及如何回到'tag2'以便插入?
答案 0 :(得分:0)
将上述XML数据用作字符串:
XMLDocument.prototype.getElementByContent = function getElementByContent(str) {
var elems = this.querySelectorAll("*");
for (var i = 0, l = elems.length; i < l; i++) {
if (elems[i].textContent === str) {
return elems[i];
}
}
};
var parser = new DOMParser();
var xmlDoc = parser.parseFromString(xmlString, "text/xml");
var tag = xmlDoc.createElement("tag3");
var content = xmlDoc.createTextNode("data3");
tag.appendChild(content);
xmlDoc.getElementByContent("data2").parentNode.appendChild(tag);
/*
#docment▼ (XMLDocument)
<tag1>▼
<tag2>▼
<tag3>data</tag3>
</tag2>
<tag2>▼
<tag3>data2</tag3>
<tag3>data3</tag3>
</tag2>
</tag1>
*/
答案 1 :(得分:0)
以下示例说明如何使用其中一些方法来访问XML数据。阅读内联注释以了解代码的工作原理。
Use Notepad or a similar text editor to save the following data as a file named C:\Q317663.xml:
<?xml version='1.0' encoding='ISO-8859-1' standalone='yes'?>
<Collection>
<Book Id='1' ISBN='1-100000ABC-200'>
<Title>Principle of Relativity</Title>
<!-- Famous physicist -->
<Author>Albert Einstein</Author>
<Genre>Physics</Genre>
</Book>
<Book Id='2' ISBN='1-100000ABC-300'>
<!-- Also came as a TV serial -->
<Title>Cosmos</Title>
<Author>Carl Sagan</Author>
<Genre>Cosmology</Genre>
</Book>
<!-- Add additional books here -->
</Collection>
Create a new Visual Basic .NET Console Application project.
Replace the code in Module1.vb with the following code. This example loads the XML document from a file representing a collection of Books and then accesses the content using some of the methods mentioned earlier.
Imports System.Xml
Imports System.Text
Module Module1
Sub Main()
Try
' Create an Xml document instance and load XML data.
Dim doc As XmlDocument = New XmlDocument()
doc.Load("C:\Q317663.xml")
' 1. Select all the Book titles by using an XPath query.
Dim nodeList As XmlNodeList = doc.SelectNodes("//Book/Title")
Dim node As XmlNode
Console.WriteLine("{0}", "TITLES LIST: ")
For Each node In nodeList
Console.WriteLine("{0}", node.InnerText)
Next
' 2. Read the XmlDeclartion values.
Dim decl As XmlDeclaration = CType(doc.FirstChild, XmlDeclaration)
Console.WriteLine("{0}", vbNewLine & "XML DECLARTION:")
Console.WriteLine("{0}", "Version " & "= " & decl.Version)
Console.WriteLine("{0}", "Encoding " & "= " & decl.Encoding)
Console.WriteLine("{0}", "Standalone " & "= " & decl.Standalone)
' 3. Move to the first node of DOM and get all of its attributes.
Dim root As XmlElement = doc.DocumentElement
node = root.FirstChild
Dim attr As XmlAttribute
Console.WriteLine("{0}", vbNewLine & "ATTRIBUTES OF THE FIRST CHILD:")
For Each attr In node.Attributes
Console.WriteLine("{0}", attr.Name & " = " & attr.InnerText)
Next
' 4. Navigate to the child nodes of the first Book node.
Dim cNode As XmlNode
Console.WriteLine("{0}", vbNewLine & "FIRST NODE'S CHILDREN:")
If node.HasChildNodes Then
For Each cNode In node.ChildNodes
Console.WriteLine("{0}", cNode.OuterXml)
Next
End If
' 5. Navigate to the next sibling of the first Book node.
node = node.NextSibling
Console.WriteLine("{0}", vbNewLine & "NEXT SIBLING:")
If Not node Is Nothing Then
Console.WriteLine("{0}", node.OuterXml)
End If
' 6. Get the parent node details of the current node.
Console.WriteLine("{0}", vbNewLine & "PARENT NODE NAME = " & node.ParentNode.Name)
Console.WriteLine("{0}", "PARENT NODE HAS " & node.ParentNode.ChildNodes.Count & " CHILD NODES")
Console.WriteLine("{0}", "PARENT NODE'S NAMESPACE URI = " & node.ParentNode.NamespaceURI)
' 7. Count the number of Comment nodes in the document.
' You could search for other types in the same way.
Dim commentNodes As Integer = GetNodeTypeCount(doc.DocumentElement, XmlNodeType.Comment)
Console.WriteLine("{0}", vbNewLine & "NUMBER OF COMMENT NODES IN THE DOC = " & commentNodes & vbNewLine)
Console.ReadLine()
Catch xmlex As XmlException ' Handle the Xml Exceptions here
Console.WriteLine("{0}", xmlex.Message)
Catch ex As Exception ' Handle the generic Exceptions here
Console.WriteLine("{0}", ex.Message)
End Try
End Sub
Function GetNodeTypeCount(ByVal node As XmlNode, ByVal nodeType As XmlNodeType) As Integer
' Recursively loop through the given node and return
' the number of occurences of a specific nodeType.
Dim i As Integer = 0
Dim cNode As XmlNode
If node.NodeType = nodeType Then
i = i + 1
End If
If node.HasChildNodes Then
For Each cNode In node.ChildNodes
i = i + GetNodeTypeCount(cNode, nodeType)
Next
End If
GetNodeTypeCount = i
End Function
End Module
Compile and then run the application. The output should resemble the following:
TITLES LIST:
Principle of Relativity
Cosmos
XML DECLARTION:
Version = 1.0
Encoding = ISO-8859-1
Standalone = yes
ATTRIBUTES OF THE FIRST CHILD:
Id = 1
ISBN = 1-100000ABC-200
FIRST NODE'S CHILDREN:
<Title>Principle of Relativity</Title>
<!-- Famous physicist -->
<Author>Albert Einstein</Author>
<Genre>Physics</Genre>
NEXT SIBLING:
<Book Id="2" ISBN="1-100000ABC-300"><!-- Also came as a TV serial --><Title>Cosm
os</Title><Author>Carl Sagan</Author><Genre>Cosmology</Genre></Book>
PARENT NODE NAME = Collection
PARENT NODE HAS 3 CHILD NODES
PARENT NODE'S NAMESPACE URI =
NUMBER OF COMMENT NODES IN THE DOC = 3