Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAtsushi Eno <atsushieno@gmail.com>2008-06-05 00:06:44 +0400
committerAtsushi Eno <atsushieno@gmail.com>2008-06-05 00:06:44 +0400
commitb4c814a17c446cc41eb5424abd1e575a22679261 (patch)
tree0ec88bbf7b30957806a67f835799c1606dc79d53 /mcs/class/System.XML/Mono.Xml.XPath
parent87daeaee005859fca8c230f4d524e682b8c83526 (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/ChangeLog7
-rw-r--r--mcs/class/System.XML/Mono.Xml.XPath/DTMXPathDocumentBuilder2.cs127
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;
}
}