如何使用DOM通过其中的数据查找XML元素?

时间:2012-12-23 14:03:23

标签: javascript xml dom

我必须在特定位置的XML文件中插入数据。例如:

<tag1>
   <tag2>
      <tag3>data</tag3>
   </tag2>
   <tag2>
      <tag3>data2</tag3>
   </tag2>
</tag1>

我必须使用DOM找到'data2'而不是返回并在其中包含'data2'的'tag2'中插入新元素。更具体地说,我正在编写一个获取参数的函数:搜索键和要插入的数据。

我怎样才能找到'data2'以及如何回到'tag2'以便插入?

2 个答案:

答案 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>​
*/

工作示例:http://jsfiddle.net/elias94xx/nFB7G/

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