瀏覽代碼

Added node findElement() method.

woollybah 6 年之前
父節點
當前提交
6bbf20c205
共有 4 個文件被更改,包括 54 次插入1 次删除
  1. 2 1
      xml.mod/common.bmx
  2. 20 0
      xml.mod/doc/txmlnode_findelement.bmx
  3. 24 0
      xml.mod/glue.c
  4. 8 0
      xml.mod/xml.bmx

+ 2 - 1
xml.mod/common.bmx

@@ -49,7 +49,8 @@ Extern
 	Function bmx_mxmlGetLastChild:Byte Ptr(handle:Byte Ptr)
 	Function bmx_mxmlGetNextSibling:Byte Ptr(handle:Byte Ptr)
 	Function bmx_mxmlGetPrevSibling:Byte Ptr(handle:Byte Ptr)
-	
+	Function bmx_mxmlFindElement:Byte Ptr(handle:Byte Ptr, element:String, attr:String, value:String)
+
 	Function bmx_mxmlSaveStdout:Int(handle:Byte Ptr, format:Int)
 	Function bmx_mxmlSaveString:String(handle:Byte Ptr, format:Int)
 	Function bmx_mxmlSaveStream:Int(handle:Byte Ptr, stream:TStream, format:Int)

+ 20 - 0
xml.mod/doc/txmlnode_findelement.bmx

@@ -0,0 +1,20 @@
+SuperStrict
+
+Framework brl.xml
+Import brl.standardio
+
+Local docname:String = "sample.xml"
+Local doc:TxmlDoc
+
+doc = TxmlDoc.parseFile(docname)
+If doc Then
+
+	Local root:TxmlNode = doc.getRootElement()
+	
+	Local node:TxmlNode = root.findElement("author")
+	
+	If node Then
+		Print node.ToString()
+	End If
+
+End If

+ 24 - 0
xml.mod/glue.c

@@ -381,3 +381,27 @@ BBString * bmx_mxmlGetContent(mxml_node_t * node) {
 	}
 	return bbStringFromUTF8String(txt);
 }
+
+mxml_node_t * bmx_mxmlFindElement(mxml_node_t * node, BBString * element, BBString * attr, BBString * value) {
+	char * e = 0;
+	char * a = 0;
+	char * v = 0;
+	
+	if (element != &bbEmptyString) {
+		e = bbStringToUTF8String(element);
+	}
+	if (attr != &bbEmptyString) {
+		a = bbStringToUTF8String(attr);
+	}
+	if (value != &bbEmptyString) {
+		v = bbStringToUTF8String(value);
+	}
+	
+	mxml_node_t * result = mxmlFindElement(node, node, e, a, v, MXML_DESCEND);
+	
+	bbMemFree(v);
+	bbMemFree(a);
+	bbMemFree(e);
+	
+	return result;
+}

+ 8 - 0
xml.mod/xml.bmx

@@ -263,6 +263,14 @@ Type TxmlNode Extends TxmlBase
 		
 		Return sb.ToString()
 	End Method
+	
+	Rem
+	bbdoc: Finds an element of the given @element name, attribute or attribute/value.
+	returns: A node or Null if no match was found.
+	End Rem
+	Method findElement:TxmlNode(element:String = "", attr:String = "", value:String = "")
+		Return TxmlNode._create(bmx_mxmlFindElement(nodePtr, element, attr, value))
+	End Method
 
 	Rem
 	bbdoc: Frees a node and all of its children.