2012-12-23 7 views
7

Muszę wstawić dane w pliku XML w określonym miejscu. Na przykład:Jak znaleźć element XML według danych w nim za pomocą DOM?

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

muszę znaleźć „dane2” używając DOM niż wrócić i wstawić nowe elementy w „tag2”, który zawiera „dane2” w nim. Dokładniej piszę funkcję, która pobiera argumenty: klucz wyszukiwania i dane do wstawienia.

Jak mogę znaleźć "dane2" i jak powrócić do "tag2", aby tam wstawić?

+0

Czy trzeba zlokalizować dowolny znacznik, który ma zawartość 'data2', czy trzeba zlokalizować drugą' tag3' w przykładzie, co dzieje się mieć wartość 'data2'? – Sampson

+0

Zakładając, że nie wprowadził błędnie sformułowania, pytanie "jak znaleźć element xml według danych w nim", pyta pierwszy, o dane, a nie o znacznik. – jhocking

+0

dane w "tag3" mają być unikalne (ale nie ID) i muszę znaleźć konkretny element z tymi danymi w nim – Gesh

Odpowiedz

0

Twoje powyższych danych XML jako ciąg:

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

przykład roboczych: http://jsfiddle.net/elias94xx/nFB7G/

+0

Dzięki to działa ale ze mną były pewne problemy. Musiałem zmienić kod, aby użyć ActiveXObject() i kilka innych poprawek. Po nich nic nie robi. Jakieś pomysły? Oto kod: function getElementByContent (str) { var elems = xmlDoc.selectNodes ("// *"); \t var result = new ActiveXObject ("Microsoft.XMLDom"); dla (var i = 0, l = elems.length; i Gesh

+0

Niestety, skopiowałem nieprawidłową wersję funkcji. Oto oryginał: funkcja getElementByContent (str) { var elems = xmlDoc.selectNodes ("// *"); \t var result = new ActiveXObject ("Microsoft.XMLDom"); dla (var i = 0, l = elems.length; i Gesh

+0

Ah Widzę. Nie mogę teraz debugować twojego kodu, odkąd jestem na moim telefonie. Czy konsola javascript coś mówi? –

0

Poniższy przykład pokazuje, jak korzystać z niektórych z tych metod dostępu do danych XML. Przeczytaj komentarze wbudowane, aby zrozumieć, jak działa kod.

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 
Powiązane problemy