From 1145e04eb025cdf611ff1069a44c6e4b16dfed0b Mon Sep 17 00:00:00 2001 From: Kevin Darlington Date: Tue, 3 Feb 2015 13:30:24 -0800 Subject: [PATCH] added SelectNodesDirect function --- document.go | 6 ++++++ node.go | 13 +++++++++++++ xmlx_test.go | 46 ++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 57 insertions(+), 8 deletions(-) diff --git a/document.go b/document.go index a718fc8..94c32ba 100644 --- a/document.go +++ b/document.go @@ -86,6 +86,12 @@ func (this *Document) SelectNodes(namespace, name string) []*Node { return this.Root.SelectNodes(namespace, name) } +// Select all nodes directly under this document, with the given namespace +// and name. Returns an empty slice if no matches were found. +func (this *Document) SelectNodesDirect(namespace, name string) []*Node { + return this.Root.SelectNodesDirect(namespace, name) +} + // Select all nodes with the given namespace and name, also recursing into the // children of those matches. Returns an empty slice if no matches were found. func (this *Document) SelectNodesRecursive(namespace, name string) []*Node { diff --git a/node.go b/node.go index e18df87..377af58 100644 --- a/node.go +++ b/node.go @@ -397,6 +397,19 @@ func (this *Node) SelectNodes(namespace, name string) []*Node { return list } +// Select multiple nodes directly under this node, by name. +func (this *Node) SelectNodesDirect(namespace, name string) []*Node { + list := make([]*Node, 0, 16) + + for _, v := range this.Children { + if (namespace == "*" || v.Name.Space == namespace) && (name == "*" || v.Name.Local == name) { + list = append(list, v) + } + } + + return list +} + // Select multiple nodes by name func (this *Node) SelectNodesRecursive(namespace, name string) []*Node { list := make([]*Node, 0, 16) diff --git a/xmlx_test.go b/xmlx_test.go index 192aa20..88e9eb2 100644 --- a/xmlx_test.go +++ b/xmlx_test.go @@ -5,8 +5,8 @@ package xmlx import ( - "testing" "encoding/xml" + "testing" ) func TestLoadLocal(t *testing.T) { @@ -256,9 +256,9 @@ func TestElementNodeValueFetch(t *testing.T) { } // node.SetValue(x); x == node.GetValue -func TestElementNodeValueFetchAndSetIdentity (t *testing.T) { +func TestElementNodeValueFetchAndSetIdentity(t *testing.T) { // Setup: xyzzy - // The xmlx parser creates a nameless NT_TEXT node containing the value 'xyzzy' + // The xmlx parser creates a nameless NT_TEXT node containing the value 'xyzzy' rootN := NewNode(NT_ROOT) rootN.Name = xml.Name{Space: "", Local: "root"} textN := NewNode(NT_ELEMENT) @@ -269,12 +269,12 @@ func TestElementNodeValueFetchAndSetIdentity (t *testing.T) { textN.AddChild(namelessN) targetN := rootN.SelectNode("", "text") // selects textN - if (targetN != textN) { + if targetN != textN { t.Errorf("Failed to get the correct textN, got %#v", targetN) } - + // targetN.Value is empty (as the value lives in the childNode) - if (targetN.Value != "") { + if targetN.Value != "" { t.Errorf("Failed to prepare correctly, TargetN.Value is not empty, it contains %#v", targetN.Value) } @@ -316,7 +316,7 @@ func TestElementNodeValueFetchAndSet(t *testing.T) { if carN == nil { t.Fatalf("Failed to get the car, got nil, wanted Node{car}") } - + colorNode := carN.SelectNode("", "color") if colorNode == nil { t.Fatalf("Failed to get the color, got nil, wanted Node{color}") @@ -337,7 +337,6 @@ func TestElementNodeValueFetchAndSet(t *testing.T) { ue` - if got := doc.Root.String(); got != expected { t.Fatalf("expected: \n%s\ngot: \n%s\n", expected, got) } @@ -368,3 +367,34 @@ func TestElementNodeValueFetchAndSet(t *testing.T) { t.Fatalf("expected: \n%s\ngot: \n%s\n", expected, got) } } + +func TestSelectNodesDirect(t *testing.T) { + data := ` + ` + doc := New() + + if err := doc.LoadString(data, nil); nil != err { + t.Fatalf("LoadString(): %s", err) + } + + root := doc.SelectNode("*", "root") + if root == nil { + t.Fatalf("Failed to get root, got nil, wanted Node{root}") + } + + nodes := root.SelectNodesDirect("*", "hidden") + + if len(nodes) != 0 { + t.Errorf("SelectDirectNodes should not select children of children.") + } + + wrapper := root.SelectNode("*", "wrapper") + if wrapper == nil { + t.Fatalf("Failed to get wrapper, got nil, wanted Node{wrapper}") + } + + nodes = wrapper.SelectNodesDirect("*", "hidden") + if len(nodes) != 2 { + t.Errorf("Unexcepted hidden nodes found. Expected: 2, Got: %d", len(nodes)) + } +}