瀏覽代碼

Implemented node getContent().

woollybah 6 年之前
父節點
當前提交
b2eac8b9fa
共有 3 個文件被更改,包括 32 次插入2 次删除
  1. 2 0
      xml.mod/common.bmx
  2. 11 2
      xml.mod/glue.c
  3. 19 0
      xml.mod/xml.bmx

+ 2 - 0
xml.mod/common.bmx

@@ -17,6 +17,7 @@ SuperStrict
 Import Pub.mxml
 Import brl.stream
 Import brl.linkedlist
+Import brl.stringbuilder
 
 Import "glue.c"
 
@@ -54,6 +55,7 @@ Extern
 	Function bmx_mxmlSaveStream:Int(handle:Byte Ptr, stream:TStream, format:Int)
 	
 	Function bmx_mxmlSetWrapMargin(column:Int)
+	Function bmx_mxmlGetContent:String(handle:Byte Ptr)
 End Extern
 
 Rem

+ 11 - 2
xml.mod/glue.c

@@ -235,7 +235,7 @@ BBString * bmx_mxmlElementGetAttrByIndex(mxml_node_t * node, int index, BBString
 }
 
 mxml_node_t * bmx_mxmlLoadStream(BBObject * stream) {
-	return mxmlLoadStream(NULL, bmx_mxml_stream_read, stream, NULL);
+	return mxmlLoadStream(NULL, bmx_mxml_stream_read, stream, MXML_OPAQUE_CALLBACK);
 }
 
 mxml_node_t * bmx_mxmlWalkNext(mxml_node_t * node, mxml_node_t * top, int descend) {
@@ -366,9 +366,18 @@ mxml_node_t * bmx_mxmlLoadString(BBString * txt) {
 	
 	struct _string_buf buf = {txt = txt};
 
-	return mxmlLoadStream(NULL, bmx_mxml_string_read, &buf, NULL);
+	return mxmlLoadStream(NULL, bmx_mxml_string_read, &buf, MXML_OPAQUE_CALLBACK);
 }
 
 void bmx_mxmlSetWrapMargin(int column) {
 	mxmlSetWrapMargin(column);
 }
+
+BBString * bmx_mxmlGetContent(mxml_node_t * node) {
+	const char * txt = mxmlGetOpaque(node);
+
+	if (!txt || strlen(txt) == 0) {
+		return &bbEmptyString;
+	}
+	return bbStringFromUTF8String(txt);
+}

+ 19 - 0
xml.mod/xml.bmx

@@ -245,6 +245,25 @@ Type TxmlNode Extends TxmlBase
 	Method previousSibling:TxmlNode()
 		Return TxmlNode._create(bmx_mxmlGetPrevSibling(nodePtr))
 	End Method
+	
+	Rem
+	bbdoc: Reads the value of a node.
+	returns: The node content.
+	End Rem
+	Method getContent:String()
+		Local sb:TStringBuilder = New TStringBuilder()
+		sb.Append(bmx_mxmlGetContent(nodePtr))
+		
+		Local n:Byte Ptr = bmx_mxmlWalkNext(nodePtr, nodePtr, MXML_DESCEND)
+		While n
+			If bmx_mxmlGetType(n) = MXML_OPAQUE Then
+				sb.Append(bmx_mxmlGetContent(n))
+			End If
+			n = bmx_mxmlWalkNext(n, nodePtr, MXML_DESCEND)
+		Wend
+		
+		Return sb.ToString()
+	End Method
 
 	Rem
 	bbdoc: Frees a node and all of its children.