diff options
author | Atsushi Eno <atsushieno@gmail.com> | 2008-06-05 00:06:44 +0400 |
---|---|---|
committer | Atsushi Eno <atsushieno@gmail.com> | 2008-06-05 00:06:44 +0400 |
commit | b4c814a17c446cc41eb5424abd1e575a22679261 (patch) | |
tree | 0ec88bbf7b30957806a67f835799c1606dc79d53 /mcs/class/System.XML/Mono.Xml.XPath | |
parent | 87daeaee005859fca8c230f4d524e682b8c83526 (diff) |
2008-06-04 Atsushi Enomoto <atsushi@ximian.com>
* DTMXPathDocumentBuilder2.cs : fixed bug #378239.cs. Merge
sequential text nodes in correct way, say, whitespace entities
inside text should be merged (while they should be discarded around
CDATA).
* XmlTextReader2.cs : added FIXME comment which won't fix, that
I have noticed during fixing bug #378239.
* XslTransformTests.cs : added test for bug #378239.
svn path=/trunk/mcs/; revision=104923
Diffstat (limited to 'mcs/class/System.XML/Mono.Xml.XPath')
-rw-r--r-- | mcs/class/System.XML/Mono.Xml.XPath/ChangeLog | 7 | ||||
-rw-r--r-- | mcs/class/System.XML/Mono.Xml.XPath/DTMXPathDocumentBuilder2.cs | 127 |
2 files changed, 74 insertions, 60 deletions
diff --git a/mcs/class/System.XML/Mono.Xml.XPath/ChangeLog b/mcs/class/System.XML/Mono.Xml.XPath/ChangeLog index 78ce570b62f..241687ec893 100644 --- a/mcs/class/System.XML/Mono.Xml.XPath/ChangeLog +++ b/mcs/class/System.XML/Mono.Xml.XPath/ChangeLog @@ -1,3 +1,10 @@ +2008-06-04 Atsushi Enomoto <atsushi@ximian.com> + + * DTMXPathDocumentBuilder2.cs : fixed bug #378239.cs. Merge + sequential text nodes in correct way, say, whitespace entities + inside text should be merged (while they should be discarded around + CDATA). + 2008-04-02 Atsushi Enomoto <atsushi@ximian.com> * XPathEditableDocument.cs : it should not expect ParentNode for diff --git a/mcs/class/System.XML/Mono.Xml.XPath/DTMXPathDocumentBuilder2.cs b/mcs/class/System.XML/Mono.Xml.XPath/DTMXPathDocumentBuilder2.cs index 127652103d6..aacd990b3a0 100644 --- a/mcs/class/System.XML/Mono.Xml.XPath/DTMXPathDocumentBuilder2.cs +++ b/mcs/class/System.XML/Mono.Xml.XPath/DTMXPathDocumentBuilder2.cs @@ -83,7 +83,7 @@ namespace Mono.Xml.XPath private void Init (XmlReader reader, XmlSpace space, int defaultCapacity) { - this.xmlReader = reader; + xmlReader = reader; this.validatingReader = reader as XmlValidatingReader; lineInfo = reader as IXmlLineInfo; this.xmlSpace = space; @@ -214,28 +214,12 @@ namespace Mono.Xml.XPath switch (xmlReader.NodeType) { case XmlNodeType.Element: case XmlNodeType.CDATA: + case XmlNodeType.Whitespace: case XmlNodeType.SignificantWhitespace: case XmlNodeType.Comment: case XmlNodeType.Text: case XmlNodeType.ProcessingInstruction: - if (parent == nodeIndex) - prevSibling = 0; - else - while (nodes [prevSibling].Parent != parent) - prevSibling = nodes [prevSibling].Parent; - - nodeIndex++; - - if (prevSibling != 0) - nodes [prevSibling].NextSibling = nodeIndex; - if (parentStack [parentStackIndex] == nodeIndex - 1) - nodes [parent].FirstChild = nodeIndex; break; - case XmlNodeType.Whitespace: - if (xmlSpace == XmlSpace.Preserve) - goto case XmlNodeType.Text; - else - goto default; case XmlNodeType.EndElement: int endedNode = parentStack [parentStackIndex]; AdjustLastNsInScope (endedNode); @@ -247,74 +231,97 @@ namespace Mono.Xml.XPath } string value = null; - XPathNodeType nodeType = XPathNodeType.Text; + XPathNodeType nodeType = XPathNodeType.Root; // dummy + bool containsCDATA = false; switch (xmlReader.NodeType) { case XmlNodeType.Element: - ProcessElement (parent, prevSibling); - break; + nodeType = XPathNodeType.Element; + goto case XmlNodeType.None; case XmlNodeType.SignificantWhitespace: - nodeType = XPathNodeType.SignificantWhitespace; - goto case XmlNodeType.Text; case XmlNodeType.Whitespace: - nodeType = XPathNodeType.Whitespace; - goto case XmlNodeType.Text; case XmlNodeType.CDATA: case XmlNodeType.Text: + skipRead = true; + do { + switch (xmlReader.NodeType) { + case XmlNodeType.Whitespace: + switch (nodeType) { + case XPathNodeType.Root: + nodeType = XPathNodeType.Whitespace; + break; + } + // whitespaces after CDATA are ignored + if (!containsCDATA) + value += xmlReader.Value; + continue; + case XmlNodeType.SignificantWhitespace: + if (nodeType == XPathNodeType.Root || + nodeType == XPathNodeType.Whitespace) + nodeType = XPathNodeType.SignificantWhitespace; + value += xmlReader.Value; + continue; + case XmlNodeType.CDATA: + // whitespaces before CDATA are ignored + if (nodeType != XPathNodeType.Text) + value = String.Empty; + containsCDATA = true; + goto case XmlNodeType.Text; + case XmlNodeType.Text: + nodeType = XPathNodeType.Text; + value += xmlReader.Value; + continue; + } + break; + } while (xmlReader.Read ()); + goto case XmlNodeType.None; + case XmlNodeType.None: + if (nodeType == XPathNodeType.Root || + nodeType == XPathNodeType.Whitespace && xmlSpace != XmlSpace.Preserve) + return; // do not process as a node. + + // prepare a slot for new node. + if (parent == nodeIndex) + prevSibling = 0; + else + while (nodes [prevSibling].Parent != parent) + prevSibling = nodes [prevSibling].Parent; + + nodeIndex++; + + if (prevSibling != 0) + nodes [prevSibling].NextSibling = nodeIndex; + if (parentStack [parentStackIndex] == nodeIndex - 1) + nodes [parent].FirstChild = nodeIndex; + + // append new node. + if (nodeType == XPathNodeType.Element) { + ProcessElement (parent, prevSibling); + break; + } AddNode (parent, 0, prevSibling, nodeType, AtomicIndex (xmlReader.BaseURI), xmlReader.IsEmptyElement, - AtomicIndex (xmlReader.LocalName), // for PI - AtomicIndex (xmlReader.NamespaceURI), // for PI + skipRead ? 0 : AtomicIndex (xmlReader.LocalName), // for PI + skipRead ? 0 : AtomicIndex (xmlReader.NamespaceURI), // for PI AtomicIndex (xmlReader.Prefix), value == null ? 0 : NonAtomicIndex (value), AtomicIndex (xmlReader.XmlLang), nsIndex, lineInfo != null ? lineInfo.LineNumber : 0, lineInfo != null ? lineInfo.LinePosition : 0); - // this code is tricky, but after sequential - // Read() invokation, xmlReader is moved to - // next node. - if (value == null) { - bool loop = true; - value = String.Empty; - XPathNodeType type = XPathNodeType.Whitespace; - do { - switch (xmlReader.NodeType) { - case XmlNodeType.Text: - case XmlNodeType.CDATA: - type = XPathNodeType.Text; - goto case XmlNodeType.Whitespace; - case XmlNodeType.SignificantWhitespace: - if (type == XPathNodeType.Whitespace) - type = XPathNodeType.SignificantWhitespace; - goto case XmlNodeType.Whitespace; - case XmlNodeType.Whitespace: - if (xmlReader.NodeType != XmlNodeType.Whitespace || xmlSpace == XmlSpace.Preserve) - value += xmlReader.Value; - loop = xmlReader.Read (); - skipRead = true; - continue; - default: - loop = false; - break; - } - } while (loop); - nodes [nodeIndex].Value = NonAtomicIndex (value); - nodes [nodeIndex].NodeType = type; - } break; case XmlNodeType.Comment: value = xmlReader.Value; nodeType = XPathNodeType.Comment; - goto case XmlNodeType.Text; + goto case XmlNodeType.None; case XmlNodeType.ProcessingInstruction: value = xmlReader.Value; nodeType = XPathNodeType.ProcessingInstruction; - goto case XmlNodeType.Text; + goto case XmlNodeType.None; } } |