public void Navigate()
        {
            var source = new TestSource1();
            var nav    = new NavigableNavigator(source);

            nav.MoveToRoot();
            Assert.AreEqual("", nav.Name); // because we're at root
            nav.MoveToFirstChild();
            Assert.AreEqual("root", nav.Name);
            nav.MoveToFirstChild();
            Assert.AreEqual("type1", nav.Name); // our first content
            nav.MoveToFirstAttribute();
            Assert.AreEqual("id", nav.Name);
            Assert.AreEqual("1", nav.Value);
            nav.MoveToNextAttribute();
            Assert.AreEqual("prop1", nav.Name);
            Assert.AreEqual("1:p1", nav.Value);
            nav.MoveToNextAttribute();
            Assert.AreEqual("prop2", nav.Name);
            Assert.AreEqual("1:p2", nav.Value);
            Assert.IsFalse(nav.MoveToNextAttribute());
            nav.MoveToParent();
            nav.MoveToFirstChild();
            Assert.AreEqual("prop3", nav.Name);
            Assert.AreEqual("1:p3", nav.Value);

            Assert.IsFalse(nav.MoveToNext());
        }
        public override XPathNavigator CreateNodeNavigator(int id, bool preview)
        {
            var source    = new Source(this, preview);
            var navigator = new NavigableNavigator(source);

            return(navigator.CloneWithNewRoot(id, 0));
        }
    public void MaxDepthNavigator()
    {
        var source = new TestSource5();
        var nav    = new NavigableNavigator(source, maxDepth: 1);

        // go to /root
        Assert.IsTrue(nav.MoveToFirstChild());
        Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
        Assert.AreEqual(-1, (nav.UnderlyingObject as TestContent).Id);

        // go to /root/1
        Assert.IsTrue(nav.MoveToFirstChild());
        Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
        Assert.AreEqual(1, (nav.UnderlyingObject as TestContent).Id);
        Assert.IsTrue(nav.MoveToId("1"));
        Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
        Assert.AreEqual(1, (nav.UnderlyingObject as TestContent).Id);

        // go to /root/1/prop1
        Assert.IsTrue(nav.MoveToFirstChild());

        // go to /root/1/prop2
        Assert.IsTrue(nav.MoveToNext());

        // can't go to /root/1/3
        Assert.IsFalse(nav.MoveToNext());
        Assert.IsFalse(nav.MoveToId("3"));

        //// Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
        //// Assert.AreEqual(3, (nav.UnderlyingObject as TestContent).Id);
    }
        public void RootedNavigator()
        {
            var source = new TestSource5();
            var nav    = new NavigableNavigator(source, source.Get(1));

            // go to (/root) /1
            Assert.IsTrue(nav.MoveToFirstChild());
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
            Assert.AreEqual(1, (nav.UnderlyingObject as TestContent).Id);

            // go to (/root) /1/prop1
            Assert.IsTrue(nav.MoveToFirstChild());
            // go to (/root) /1/prop2
            Assert.IsTrue(nav.MoveToNext());
            // go to (/root) /1/3
            Assert.IsTrue(nav.MoveToNext());
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
            Assert.AreEqual(3, (nav.UnderlyingObject as TestContent).Id);

            // go to (/root) /1
            Assert.IsTrue(nav.MoveToParent());
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
            Assert.AreEqual(1, (nav.UnderlyingObject as TestContent).Id);

            // go to (/root) ie root
            Assert.IsTrue(nav.MoveToParent());
            Assert.AreEqual(NavigableNavigator.StatePosition.Root, nav.InternalState.Position);
            Assert.IsFalse(nav.MoveToParent());

            // can't go there
            Assert.IsFalse(nav.MoveToId("2"));
        }
        public XPathNavigator CreateNavigator()
        {
            var source    = new Source(this, false);
            var navigator = new NavigableNavigator(source);

            return(navigator);
        }
        public void NavigableXmlValues()
        {
            var source = new TestSource6();
            var nav    = new NavigableNavigator(source);

            NavigatorValues(nav, false);
        }
    public void NavigateMixed()
    {
        var source = new TestSource2();
        var nav    = new NavigableNavigator(source);

        nav.MoveToRoot();
        nav.MoveToFirstChild();
        Assert.AreEqual("root", nav.Name);
        nav.MoveToFirstChild();
        Assert.AreEqual("type1", nav.Name); // our content
        nav.MoveToFirstChild();
        Assert.AreEqual("prop1", nav.Name); // our property
        Assert.AreEqual(XPathNodeType.Element, nav.NodeType);
        nav.MoveToFirstChild();

        // "<data><item1>poo</item1><item2 xx=\"33\" /><item2 xx=\"34\" /></data>"
        Assert.AreEqual(XPathNodeType.Element, nav.NodeType);
        Assert.AreEqual("data", nav.Name);

        nav.MoveToFirstChild();
        Assert.AreEqual(XPathNodeType.Element, nav.NodeType);
        Assert.AreEqual("item1", nav.Name);

        nav.MoveToNext();
        Assert.AreEqual(XPathNodeType.Element, nav.NodeType);
        Assert.AreEqual("item2", nav.Name);

        nav.MoveToParent();
        Assert.AreEqual(XPathNodeType.Element, nav.NodeType);
        Assert.AreEqual("data", nav.Name);

        nav.MoveToParent();
        Assert.AreEqual(XPathNodeType.Element, nav.NodeType);
        Assert.AreEqual("prop1", nav.Name);
    }
        public override XPathNavigator CreateNavigator(bool preview)
        {
            var source    = new Source(this, preview);
            var navigator = new NavigableNavigator(source);

            return(navigator);
        }
Exemple #9
0
    /// <summary>
    ///     Creates a new XPathNavigator using the same source but positioned at a new root.
    /// </summary>
    /// <returns>A new XPathNavigator using the same source and positioned at a new root.</returns>
    /// <remarks>The new root can be above this navigator's root.</remarks>
    public XPathNavigator?CloneWithNewRoot(int id, int maxDepth = int.MaxValue)
    {
        DebugEnter("CloneWithNewRoot");

        State?state = null;

        if (id <= 0)
        {
            state = new State(_source.Root, null, null, 0, StatePosition.Root);
        }
        else
        {
            INavigableContent?content = SourceGet(id);
            if (content != null)
            {
                state = new State(content, null, null, 0, StatePosition.Root);
            }
        }

        NavigableNavigator?clone = null;

        if (state != null)
        {
            clone = new NavigableNavigator(this, state, maxDepth);
            DebugCreate(clone);
            DebugReturn("[XPathNavigator]");
        }
        else
        {
            DebugReturn("[null]");
        }

        return(clone);
    }
Exemple #10
0
    /// <summary>
    ///     Creates a new XPathNavigator positioned at the same node as this XPathNavigator.
    /// </summary>
    /// <returns>A new XPathNavigator positioned at the same node as this XPathNavigator.</returns>
    public override XPathNavigator Clone()
    {
        DebugEnter("Clone");
        var nav = new NavigableNavigator(this);

        DebugCreate(nav);
        DebugReturn("[XPathNavigator]");
        return(nav);
    }
        public void QueryMixedWithVariables()
        {
            var source = new TestSource2();
            var nav    = new NavigableNavigator(source);

            var iterator = nav.Select("//item2 [@xx=$var]", new XPathVariable("var", "33"));

            Assert.AreEqual(1, iterator.Count);
            iterator.MoveNext();
            Assert.AreEqual("item2", iterator.Current.Name);
        }
        public void QueryWithVariables()
        {
            var source = new TestSource1();
            var nav    = new NavigableNavigator(source);

            var iterator = nav.Select("//* [@prop1=$var]", new XPathVariable("var", "1:p1"));

            Assert.AreEqual(1, iterator.Count);
            iterator.MoveNext();
            Assert.AreEqual("type1", iterator.Current.Name);
        }
        public void MoveToId()
        {
            var source = new TestSource5();
            var nav    = new NavigableNavigator(source);

            // move to /root/1/3
            Assert.IsTrue(nav.MoveToId("3"));
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
            Assert.AreEqual(3, (nav.UnderlyingObject as TestContent).Id);

            // move to /root/1
            Assert.IsTrue(nav.MoveToParent());
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
            Assert.AreEqual(1, (nav.UnderlyingObject as TestContent).Id);

            // move to /root
            Assert.IsTrue(nav.MoveToParent());
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
            Assert.AreEqual(-1, (nav.UnderlyingObject as TestContent).Id);

            // move up
            Assert.IsTrue(nav.MoveToParent());
            Assert.AreEqual(NavigableNavigator.StatePosition.Root, nav.InternalState.Position);
            Assert.IsFalse(nav.MoveToParent());

            // move to /root/1
            Assert.IsTrue(nav.MoveToId("1"));
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
            Assert.AreEqual(1, (nav.UnderlyingObject as TestContent).Id);

            // move to /root
            Assert.IsTrue(nav.MoveToParent());
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
            Assert.AreEqual(-1, (nav.UnderlyingObject as TestContent).Id);

            // move up
            Assert.IsTrue(nav.MoveToParent());
            Assert.AreEqual(NavigableNavigator.StatePosition.Root, nav.InternalState.Position);
            Assert.IsFalse(nav.MoveToParent());

            // move to /root
            Assert.IsTrue(nav.MoveToId("-1"));
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
            Assert.AreEqual(-1, (nav.UnderlyingObject as TestContent).Id);

            // move up
            Assert.IsTrue(nav.MoveToParent());
            Assert.AreEqual(NavigableNavigator.StatePosition.Root, nav.InternalState.Position);
            Assert.IsFalse(nav.MoveToParent());

            // get lost
            Assert.IsFalse(nav.MoveToId("666"));
        }
        public void CloneIsSafe()
        {
            var         source = new TestSource5();
            var         nav    = new NavigableNavigator(source);
            TestContent content;

            Assert.AreEqual(NavigableNavigator.StatePosition.Root, nav.InternalState.Position);
            Assert.IsTrue(nav.MoveToFirstChild());
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
            Assert.AreEqual("root", nav.Name); // at -1
            Assert.IsTrue(nav.MoveToFirstChild());
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
            Assert.AreEqual(1, (nav.UnderlyingObject as TestContent).Id);
            Assert.IsTrue(nav.MoveToFirstChild());
            Assert.AreEqual(NavigableNavigator.StatePosition.PropertyElement, nav.InternalState.Position);
            Assert.AreEqual("prop1", nav.Name);
            Assert.IsTrue(nav.MoveToNext());
            Assert.AreEqual(NavigableNavigator.StatePosition.PropertyElement, nav.InternalState.Position);
            Assert.AreEqual("prop2", nav.Name);
            Assert.IsTrue(nav.MoveToNext());
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
            Assert.AreEqual(3, (nav.UnderlyingObject as TestContent).Id);

            // at that point nav is at /root/1/3

            var clone = nav.Clone() as NavigableNavigator;

            // move nav to /root/1/5 and ensure that clone stays at /root/1/3
            Assert.IsTrue(nav.MoveToNext());
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
            Assert.AreEqual(5, (nav.UnderlyingObject as TestContent).Id);
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, clone.InternalState.Position);
            Assert.AreEqual(3, (clone.UnderlyingObject as TestContent).Id);

            // move nav to /root/2
            Assert.IsTrue(nav.MoveToParent());
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
            Assert.AreEqual(1, (nav.UnderlyingObject as TestContent).Id);
            Assert.IsTrue(nav.MoveToNext());
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
            Assert.AreEqual(2, (nav.UnderlyingObject as TestContent).Id);
            Assert.IsTrue(nav.MoveToFirstChild());
            Assert.AreEqual(NavigableNavigator.StatePosition.PropertyElement, nav.InternalState.Position);
            Assert.AreEqual("prop1", nav.Name);
            Assert.AreEqual("p21", nav.Value);

            // move clone to .. /root/1
            Assert.IsTrue(clone.MoveToParent());

            // clone has not been corrupted by nav
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, clone.InternalState.Position);
            Assert.AreEqual(1, (clone.UnderlyingObject as TestContent).Id);
        }
        public void SelectById(int id)
        {
            var source = new TestSource5();
            var nav    = new NavigableNavigator(source);

            var iter = nav.Select(string.Format("//* [@id={0}]", id));

            Assert.IsTrue(iter.MoveNext());
            var current = iter.Current as NavigableNavigator;

            Assert.AreEqual(NavigableNavigator.StatePosition.Element, current.InternalState.Position);
            Assert.AreEqual(id, (current.UnderlyingObject as TestContent).Id);
        }
        public void SelectByIdWithVariable(int id)
        {
            var source = new TestSource5();
            var nav    = new NavigableNavigator(source);

            var iter = nav.Select("//* [@id=$id]", new XPathVariable("id", id.ToString(CultureInfo.InvariantCulture)));

            Assert.IsTrue(iter.MoveNext());
            var current = iter.Current as NavigableNavigator;

            Assert.AreEqual(NavigableNavigator.StatePosition.Element, current.InternalState.Position);
            Assert.AreEqual(id, (current.UnderlyingObject as TestContent).Id);
        }
        public void OuterXml()
        {
            var source = new TestSource1();
            var nav    = new NavigableNavigator(source);

            const string xml = @"<root id=""-1"" prop1="""" prop2="""">
  <type1 id=""1"" prop1=""1:p1"" prop2=""1:p2"">
    <prop3>1:p3</prop3>
  </type1>
</root>";

            Assert.AreEqual(xml.Lf(), nav.OuterXml.Lf());
        }
        public void OuterXmlBasic()
        {
            const string xml = @"<root id=""-1"" />";

            var doc  = XmlHelper.CreateXPathDocument(xml);
            var nnav = doc.CreateNavigator();

            Assert.AreEqual(xml, nnav.OuterXml);

            var source = new TestSource0();
            var nav    = new NavigableNavigator(source);

            Assert.AreEqual(xml, nav.OuterXml);
        }
Exemple #19
0
    ///// <summary>
    ///// Initializes a new instance of the <see cref="NavigableNavigator"/> class with a content source, a name table and a state.
    ///// </summary>
    ///// <param name="source">The content source.</param>
    ///// <param name="nameTable">The name table.</param>
    ///// <param name="state">The state.</param>
    ///// <param name="maxDepth">The maximum depth.</param>
    ///// <remarks>Privately used for cloning a navigator.</remarks>
    // private NavigableNavigator(INavigableSource source, XmlNameTable nameTable, State state, int maxDepth)
    //    : this(source, rootId: 0, maxDepth: maxDepth)
    // {
    //    _nameTable = nameTable;
    //    _state = state;
    // }

    /// <summary>
    ///     Initializes a new instance of the <see cref="NavigableNavigator" /> class as a clone.
    /// </summary>
    /// <param name="orig">The cloned navigator.</param>
    /// <param name="state">The clone state.</param>
    /// <param name="maxDepth">The clone maximum depth.</param>
    /// <remarks>Privately used for cloning a navigator.</remarks>
    private NavigableNavigator(NavigableNavigator orig, State?state = null, int maxDepth = -1)
        : this(orig._source, 0, orig._maxDepth)
    {
        _nameTable = orig._nameTable;

        InternalState = state ?? orig.InternalState.Clone();
        if (state != null && maxDepth < 0)
        {
            throw new ArgumentException("Both state and maxDepth are required.");
        }

        _maxDepth = maxDepth < 0 ? orig._maxDepth : maxDepth;

        _contents = orig._contents;
    }
        public void NewNavigatorIsAtRoot()
        {
            const string xml = @"<root><item1 /><item2 /></root>";
            var          doc = XmlHelper.CreateXPathDocument(xml);
            var          nav = doc.CreateNavigator();

            Assert.AreEqual(XPathNodeType.Root, nav.NodeType);
            Assert.AreEqual(string.Empty, nav.Name);

            var source = new TestSource5();

            nav = new NavigableNavigator(source);

            Assert.AreEqual(XPathNodeType.Root, nav.NodeType);
            Assert.AreEqual(string.Empty, nav.Name);
        }
        public void Query()
        {
            var source = new TestSource1();
            var nav    = new NavigableNavigator(source);

            var iterator = nav.Select("//type1");

            Assert.AreEqual(1, iterator.Count);
            iterator.MoveNext();
            Assert.AreEqual("type1", iterator.Current.Name);

            iterator = nav.Select("//* [@prop1='1:p1']");
            Assert.AreEqual(1, iterator.Count);
            iterator.MoveNext();
            Assert.AreEqual("type1", iterator.Current.Name);
        }
    public void RootedNavigator2()
    {
        var source = new TestSource5();
        var nav    = new NavigableNavigator(source, 3);

        // go to (/root/1) /3
        Assert.IsTrue(nav.MoveToFirstChild());
        Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
        Assert.AreEqual(3, (nav.UnderlyingObject as TestContent).Id);

        // go to (/root/1)
        Assert.IsTrue(nav.MoveToParent());
        Assert.AreEqual(NavigableNavigator.StatePosition.Root, nav.InternalState.Position);
        Assert.IsFalse(nav.MoveToParent());

        // can't go there
        Assert.IsFalse(nav.MoveToId("1"));
    }
        public void MixedWithNoValue()
        {
            var source = new TestSource4();
            var nav    = new NavigableNavigator(source);

            var doc    = XmlHelper.CreateXPathDocument(@"<root id=""-1"">
                        <type1 id=""1""><prop1><data value=""value""/></prop1><prop2>dang</prop2></type1>
                        <type1 id=""2""><prop1 /><prop2></prop2></type1>
                        <type1 id=""3""><prop1 /><prop2 /></type1>
                    </root>");
            var docNav = doc.CreateNavigator();

            docNav.MoveToRoot();
            Assert.IsTrue(docNav.MoveToFirstChild());
            Assert.AreEqual("root", docNav.Name);
            Assert.IsTrue(docNav.MoveToFirstChild());
            Assert.AreEqual("type1", docNav.Name);
            Assert.IsTrue(docNav.MoveToNext());
            Assert.AreEqual("type1", docNav.Name);
            Assert.IsTrue(docNav.MoveToNext());
            Assert.AreEqual("type1", docNav.Name);
            Assert.IsFalse(docNav.MoveToNext());

            docNav.MoveToRoot();
            var docOuter = docNav.OuterXml;

            nav.MoveToRoot();
            Assert.IsTrue(nav.MoveToFirstChild());
            Assert.AreEqual("root", nav.Name);
            Assert.IsTrue(nav.MoveToFirstChild());
            Assert.AreEqual("type1", nav.Name);
            Assert.IsTrue(nav.MoveToNext());
            Assert.AreEqual("type1", nav.Name);
            Assert.IsTrue(nav.MoveToNext());
            Assert.AreEqual("type1", nav.Name);
            Assert.IsFalse(nav.MoveToNext());

            nav.MoveToRoot();
            var outer = nav.OuterXml;

            Assert.AreEqual(docOuter, outer);
        }
        public void QueryMixed()
        {
            var source = new TestSource2();
            var nav    = new NavigableNavigator(source);

            var doc     = XmlHelper.CreateXPathDocument("<data><item1>poo</item1><item2 xx=\"33\" /><item2 xx=\"34\" /></data>");
            var docNav  = doc.CreateNavigator();
            var docIter = docNav.Select("//item2 [@xx=33]");

            Assert.AreEqual(1, docIter.Count);
            Assert.AreEqual("", docIter.Current.Name);
            docIter.MoveNext();
            Assert.AreEqual("item2", docIter.Current.Name);

            var iterator = nav.Select("//item2 [@xx=33]");

            Assert.AreEqual(1, iterator.Count);
            Assert.AreEqual("", iterator.Current.Name);
            iterator.MoveNext();
            Assert.AreEqual("item2", iterator.Current.Name);
        }
        public void OuterXmlMixed()
        {
            var source = new TestSource2();
            var nav    = new NavigableNavigator(source);

            nav.MoveToRoot();

            const string outerXml = @"<root id=""-1"">
  <type1 id=""1"">
    <prop1>
      <data>
        <item1>poo</item1>
        <item2 xx=""33"" />
        <item2 xx=""34"" />
      </data>
    </prop1>
  </type1>
</root>";

            Assert.AreEqual(outerXml.Lf(), nav.OuterXml.Lf());
        }
        public void XmlNodeList()
        {
            var source = new TestSource1();
            var nav    = new NavigableNavigator(source);

            var iterator = nav.Select("/*");

            // but, that requires that the underlying navigator implements IHasXmlNode
            // so it is possible to obtain nodes from the navigator - not possible yet
            var nodes = XmlNodeListFactory.CreateNodeList(iterator);

            Assert.AreEqual(nodes.Count, 1);
            var node = nodes[0];

            Assert.AreEqual(3, node.Attributes.Count);
            Assert.AreEqual("1", node.Attributes["id"].Value);
            Assert.AreEqual("1:p1", node.Attributes["prop1"].Value);
            Assert.AreEqual("1:p2", node.Attributes["prop2"].Value);
            Assert.AreEqual(1, node.ChildNodes.Count);
            Assert.AreEqual("prop3", node.FirstChild.Name);
            Assert.AreEqual("1:p3", node.FirstChild.Value);
        }
        public void RootedMaxDepthNavigator()
        {
            var source = new TestSource5();
            var nav    = new NavigableNavigator(source, rootId: 1, maxDepth: 0);

            // go to (/root) /1
            Assert.IsTrue(nav.MoveToFirstChild());
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
            Assert.AreEqual(1, (nav.UnderlyingObject as TestContent).Id);

            // go to (/root)
            Assert.IsTrue(nav.MoveToParent());
            Assert.AreEqual(NavigableNavigator.StatePosition.Root, nav.InternalState.Position);
            Assert.IsFalse(nav.MoveToParent());

            // go to (/root) /1
            Assert.IsTrue(nav.MoveToId("1"));
            Assert.AreEqual(NavigableNavigator.StatePosition.Element, nav.InternalState.Position);
            Assert.AreEqual(1, (nav.UnderlyingObject as TestContent).Id);

            // can't go there
            Assert.IsFalse(nav.MoveToId("-1"));
            Assert.IsFalse(nav.MoveToId("3"));
        }
        public void WhiteSpacesAndEmptyValues()
        {
            // "When Microsoft’s DOM builder receives a text node from the parser
            // that contains only white space, it is thrown away." - so if it's ONLY
            // spaces, it's nothing, but spaces are NOT trimmed.

            // For attributes, spaces are preserved even when there's only spaces.

            var doc = XmlHelper.CreateXPathDocument(@"<root>
                        <item><prop/></item>
                        <item><prop></prop></item>
                        <item><prop> </prop></item>
                        <item><prop> 
                            </prop></item>
                        <item><prop> ooo </prop></item>
                        <item><prop> ooo 
                            </prop></item>
                        <item x=""""/>
                        <item x="" ""/>
                    </root>");

            var docNav = doc.CreateNavigator();

            Assert.AreEqual(@"<root>
  <item>
    <prop />
  </item>
  <item>
    <prop></prop>
  </item>
  <item>
    <prop></prop>
  </item>
  <item>
    <prop></prop>
  </item>
  <item>
    <prop> ooo </prop>
  </item>
  <item>
    <prop> ooo 
                            </prop>
  </item>
  <item x="""" />
  <item x="" "" />
</root>".Lf(), docNav.OuterXml.Lf());

            docNav.MoveToRoot();
            Assert.IsTrue(docNav.MoveToFirstChild());
            Assert.IsTrue(docNav.MoveToFirstChild());
            Assert.IsTrue(docNav.MoveToFirstChild()); // prop
            Assert.IsTrue(docNav.IsEmptyElement);
            Assert.IsTrue(docNav.MoveToParent());
            Assert.IsTrue(docNav.MoveToNext());
            Assert.IsTrue(docNav.MoveToFirstChild()); // prop
            Assert.IsFalse(docNav.IsEmptyElement);
            Assert.AreEqual("", docNav.Value);        // contains an empty text node
            Assert.IsTrue(docNav.MoveToParent());
            Assert.IsTrue(docNav.MoveToNext());
            Assert.IsTrue(docNav.MoveToFirstChild()); // prop
            Assert.IsFalse(docNav.IsEmptyElement);
            Assert.AreEqual("", docNav.Value);        // contains an empty text node

            var source = new TestSource8();
            var nav    = new NavigableNavigator(source);

            // shows how whitespaces are handled by NavigableNavigator
            Assert.AreEqual(@"<root id=""-1"" attr="""">
  <item id=""1"" attr="""">
    <prop />
  </item>
  <item id=""2"" attr="""">
    <prop></prop>
  </item>
  <item id=""3"" attr=""   "">
    <prop>   </prop>
  </item>
  <item id=""4"" attr="""">
    <prop>
</prop>
  </item>
  <item id=""5"" attr=""  ooo  "">
    <prop>   ooo   </prop>
  </item>
</root>".Lf(), nav.OuterXml.Lf());
        }
        public void XsltDebugModeAndSortOrder(bool native, bool debug)
        {
            const string xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<root>
    <node id=""1"" isDoc=""1"">
        <title>title-1</title>
        <node id=""3"" isDoc=""1"">
            <title>title-3</title>
            <node id=""7"" isDoc=""1"">
                <title>title-7</title>
            </node>
            <node id=""8"" isDoc=""1"">
                <title>title-8</title>
            </node>
        </node>
        <node id=""5"" isDoc=""1"">
            <title>title-5</title>
        </node>
    </node>
    <node id=""2"" isDoc=""1"">
        <title>title-2</title>
        <node id=""4"" isDoc=""1"">
            <title>title-4</title>
        </node>
        <node id=""6"" isDoc=""1"">
            <title>title-6</title>
        </node>
    </node>
</root>
";

            const string xslt     = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<!DOCTYPE xsl:stylesheet [
    <!ENTITY nbsp ""&#x00A0;"">
]>
<xsl:stylesheet
  version=""1.0""
  xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
  xmlns:msxml=""urn:schemas-microsoft-com:xslt""
	xmlns:umbraco.library=""urn:umbraco.library"" xmlns:Exslt.ExsltCommon=""urn:Exslt.ExsltCommon"" xmlns:Exslt.ExsltDatesAndTimes=""urn:Exslt.ExsltDatesAndTimes"" xmlns:Exslt.ExsltMath=""urn:Exslt.ExsltMath"" xmlns:Exslt.ExsltRegularExpressions=""urn:Exslt.ExsltRegularExpressions"" xmlns:Exslt.ExsltStrings=""urn:Exslt.ExsltStrings"" xmlns:Exslt.ExsltSets=""urn:Exslt.ExsltSets"" xmlns:Examine=""urn:Examine"" 
	exclude-result-prefixes=""msxml umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings Exslt.ExsltSets Examine "">

    <xsl:output method=""xml"" omit-xml-declaration=""yes"" />
    <xsl:param name=""currentPage""/>

    <xsl:template match=""/"">
		<!-- <xsl:for-each select=""/root/* [@isDoc]""> -->
        <!-- <xsl:for-each select=""$currentPage/root/* [@isDoc]""> -->
        <xsl:for-each select=""/macro/nav/root/* [@isDoc]"">
<xsl:text>! </xsl:text><xsl:value-of select=""title"" /><xsl:text>
</xsl:text>
			<xsl:for-each select=""./* [@isDoc]"">
<xsl:text>!! </xsl:text><xsl:value-of select=""title"" /><xsl:text>
</xsl:text>
                <xsl:for-each select=""./* [@isDoc]"">
<xsl:text>!!! </xsl:text><xsl:value-of select=""title"" /><xsl:text>
</xsl:text>
	            </xsl:for-each>
			</xsl:for-each>
		</xsl:for-each>
    </xsl:template>

</xsl:stylesheet>
";
            const string expected = @"! title-1
!! title-3
!!! title-7
!!! title-8
!! title-5
! title-2
!! title-4
!! title-6
";

            // see http://www.onenaught.com/posts/352/xslt-performance-tip-dont-indent-output
            // why aren't we using an XmlWriter here?

            var transform = new XslCompiledTransform(debug);
            var xmlReader = new XmlTextReader(new StringReader(xslt))
            {
                EntityHandling = EntityHandling.ExpandEntities
            };
            var xslResolver = new XmlUrlResolver
            {
                Credentials = CredentialCache.DefaultCredentials
            };
            var args = new XsltArgumentList();

            // .Default is more restrictive than .TrustedXslt
            transform.Load(xmlReader, XsltSettings.Default, xslResolver);

            XPathNavigator macro;

            if (!native)
            {
                var source = new TestSource7();
                var nav    = new NavigableNavigator(source);
                //args.AddParam("currentPage", string.Empty, nav.Clone());

                var x = new XmlDocument();
                x.LoadXml(xml);

                macro = new MacroNavigator(new[]
                {
                    // it even fails like that => macro nav. issue?
                    new MacroNavigator.MacroParameter("nav", x.CreateNavigator()) // nav.Clone())
                }
                                           );
            }
            else
            {
                var doc = new XmlDocument();
                doc.LoadXml("<macro />");
                var nav = doc.CreateElement("nav");
                doc.DocumentElement.AppendChild(nav);
                var x = new XmlDocument();
                x.LoadXml(xml);
                nav.AppendChild(doc.ImportNode(x.DocumentElement, true));
                macro = doc.CreateNavigator();
            }

            var writer = new StringWriter();

            transform.Transform(macro, args, writer);

            // this was working with native, debug and non-debug
            // this was working with macro nav, non-debug
            // but was NOT working (changing the order of nodes) with macro nav, debug
            // was due to an issue with macro nav IsSamePosition, fixed

            //Console.WriteLine("--------");
            //Console.WriteLine(writer.ToString());
            Assert.AreEqual(expected.Lf(), writer.ToString().Lf());
        }
Exemple #30
0
    private void DebugCreate(NavigableNavigator nav)
    {
#if DEBUGNAVIGATOR
        Debug("Create: [NavigableNavigator::{0}]", nav._uid);
#endif
    }