private void LoadEntityAttributeChildren(XmlNode parent) { while (reader.ReadAttributeValue()) { switch (reader.NodeType) { case XmlNodeType.EndEntity: // exit read loop return; case XmlNodeType.Text: parent.AppendChild(new XmlText(reader.Value, this.doc)); break; case XmlNodeType.EntityReference: { XmlEntityReference eref = new XmlEntityReference(reader.LocalName, this.doc); reader.ResolveEntity(); LoadEntityAttributeChildren(eref); //what if eref doesn't have children at all? should we just put a Empty String text here? if (eref.ChildNodes.Count == 0) { eref.AppendChild(new XmlText("")); } parent.AppendChild(eref); break; } default: throw new InvalidOperationException(Res.GetString(Res.Xdom_Load_NodeType) + reader.NodeType); } } }
//The function is called when expanding the entity ref. ( inside XmlEntityReference.SetParent ) internal void ExpandEntityReference(XmlEntityReference eref) { //when the ent ref is not associated w/ an entity, append an empty string text node as child this.doc = eref.OwnerDocument; bool bOrigLoadingState = doc.IsLoading; doc.IsLoading = true; switch (eref.Name) { case "lt": eref.AppendChild(doc.CreateTextNode("<")); doc.IsLoading = bOrigLoadingState; return; case "gt": eref.AppendChild(doc.CreateTextNode(">")); doc.IsLoading = bOrigLoadingState; return; case "amp": eref.AppendChild(doc.CreateTextNode("&")); doc.IsLoading = bOrigLoadingState; return; case "apos": eref.AppendChild(doc.CreateTextNode("'")); doc.IsLoading = bOrigLoadingState; return; case "quot": eref.AppendChild(doc.CreateTextNode("\"")); doc.IsLoading = bOrigLoadingState; return; } XmlNamedNodeMap entities = doc.Entities; foreach (XmlEntity ent in entities) { if (Ref.Equal(ent.Name, eref.Name)) { ParsePartialContent(eref, EntitizeName(eref.Name), XmlNodeType.EntityReference); return; } } //no fit so far if (!(doc.ActualLoadingStatus)) { eref.AppendChild(doc.CreateTextNode("")); doc.IsLoading = bOrigLoadingState; } else { doc.IsLoading = bOrigLoadingState; throw new XmlException(Res.Xml_UndeclaredParEntity, eref.Name); } }
private XmlEntityReference LoadEntityReferenceNode() { Debug.Assert(reader.NodeType == XmlNodeType.EntityReference); XmlEntityReference eref = doc.CreateEntityReference(reader.Name); if (reader.CanResolveEntity) { reader.ResolveEntity(); LoadChildren(eref); // Code internally relies on the fact that an EntRef nodes has at least one child (even an empty text node). Ensure that this holds true, // if the reader does not present any children for the ent-ref if (eref.LastChild == null) { eref.AppendChild(doc.CreateTextNode("")); } } return(eref); }
//The function is called when expanding the entity ref. ( inside XmlEntityReference.SetParent ) internal void ExpandEntityReference(XmlEntityReference eref) { //when the ent ref is not associated w/ an entity, append an empty string text node as child this.doc = eref.OwnerDocument; bool bOrigLoadingState = doc.IsLoading; doc.IsLoading = true; switch ( eref.Name ) { case "lt": eref.AppendChild( doc.CreateTextNode( "<" ) ); doc.IsLoading = bOrigLoadingState; return; case "gt": eref.AppendChild( doc.CreateTextNode( ">" ) ); doc.IsLoading = bOrigLoadingState; return; case "amp": eref.AppendChild( doc.CreateTextNode( "&" ) ); doc.IsLoading = bOrigLoadingState; return; case "apos": eref.AppendChild( doc.CreateTextNode( "'" ) ); doc.IsLoading = bOrigLoadingState; return; case "quot": eref.AppendChild( doc.CreateTextNode( "\"" ) ); doc.IsLoading = bOrigLoadingState; return; } XmlNamedNodeMap entities = doc.Entities; foreach ( XmlEntity ent in entities ) { if ( Ref.Equal( ent.Name, eref.Name ) ) { ParsePartialContent( eref, EntitizeName(eref.Name), XmlNodeType.EntityReference ); return; } } //no fit so far if( !( doc.ActualLoadingStatus ) ) { eref.AppendChild( doc.CreateTextNode( "" ) ); doc.IsLoading = bOrigLoadingState; } else { doc.IsLoading = bOrigLoadingState; throw new XmlException( Res.Xml_UndeclaredParEntity, eref.Name ); } }
private void LoadEntityAttributeChildren( XmlNode parent ) { while (reader.ReadAttributeValue()) { switch (reader.NodeType) { case XmlNodeType.EndEntity: // exit read loop return; case XmlNodeType.Text: parent.AppendChild( new XmlText( reader.Value, this.doc ) ); break; case XmlNodeType.EntityReference: { XmlEntityReference eref = new XmlEntityReference( reader.LocalName, this.doc ); reader.ResolveEntity(); LoadEntityAttributeChildren( eref ); //what if eref doesn't have children at all? should we just put a Empty String text here? if ( eref.ChildNodes.Count == 0 ) eref.AppendChild( new XmlText("") ); parent.AppendChild( eref ); break; } default: throw new InvalidOperationException(Res.GetString(Res.Xdom_Load_NodeType) + reader.NodeType); } } }
private XmlNode LoadEntityChildren() { XmlNode node = null; // We do not use creator functions on XmlDocument, b/c we do not want to let users extend the nodes that are children of entity nodes (also, if we do // this, XmlDataDocument will have a problem, b/c they do not know that those nodes should not be mapped). switch (reader.NodeType) { case XmlNodeType.EndElement: case XmlNodeType.EndEntity: break; case XmlNodeType.Element: { bool fEmptyElement = reader.IsEmptyElement; XmlElement element = new XmlElement( reader.Prefix, reader.LocalName, reader.NamespaceURI, this.doc ); element.IsEmpty = fEmptyElement; while(reader.MoveToNextAttribute()) { XmlAttribute attr = (XmlAttribute) LoadEntityChildren(); element.Attributes.Append( attr ); } // recursively load all children. if (! fEmptyElement) LoadEntityChildren( element ); node = element; break; } case XmlNodeType.Attribute: if (reader.IsDefault) { XmlUnspecifiedAttribute attr = new XmlUnspecifiedAttribute( reader.Prefix, reader.LocalName, reader.NamespaceURI, this.doc ); LoadEntityAttributeChildren( attr ); attr.SetSpecified( false ); node = attr; } else { XmlAttribute attr = new XmlAttribute( reader.Prefix, reader.LocalName, reader.NamespaceURI, this.doc ); LoadEntityAttributeChildren( attr ); node = attr; } break; case XmlNodeType.SignificantWhitespace: node = new XmlSignificantWhitespace( reader.Value, this.doc ); break; case XmlNodeType.Whitespace: if ( preserveWhitespace ) node = new XmlWhitespace( reader.Value, this.doc ); else { // if preserveWhitespace is false skip all subsequent WS nodes and position on the first non-WS node do { if (! reader.Read() ) return null; } while (reader.NodeType == XmlNodeType.Whitespace); node = LoadEntityChildren(); // Skip WS node if preserveWhitespace is false } break; case XmlNodeType.Text: node = new XmlText( reader.Value, this.doc ); break; case XmlNodeType.CDATA: node = new XmlCDataSection( reader.Value, this.doc ); break; case XmlNodeType.EntityReference:{ XmlEntityReference eref = new XmlEntityReference( reader.Name, this.doc ); if ( reader.CanResolveEntity ) { reader.ResolveEntity(); LoadEntityChildren( eref ); //what if eref doesn't have children at all? should we just put a Empty String text here? if ( eref.ChildNodes.Count == 0 ) eref.AppendChild( new XmlText("") ); } node = eref; break; } case XmlNodeType.ProcessingInstruction: node = new XmlProcessingInstruction( reader.Name, reader.Value, this.doc ); break; case XmlNodeType.Comment: node = new XmlComment( reader.Value, this.doc ); break; default: throw new InvalidOperationException(string.Format(Res.GetString(Res.Xdom_Load_NodeType),reader.NodeType.ToString())); } return node; }
private XmlNode LoadEntityChildren() { XmlNode node = null; // We do not use creator functions on XmlDocument, b/c we do not want to let users extend the nodes that are children of entity nodes (also, if we do // this, XmlDataDocument will have a problem, b/c they do not know that those nodes should not be mapped). switch (reader.NodeType) { case XmlNodeType.EndElement: case XmlNodeType.EndEntity: break; case XmlNodeType.Element: { bool fEmptyElement = reader.IsEmptyElement; XmlElement element = new XmlElement(reader.Prefix, reader.LocalName, reader.NamespaceURI, this.doc); element.IsEmpty = fEmptyElement; while (reader.MoveToNextAttribute()) { XmlAttribute attr = (XmlAttribute)LoadEntityChildren(); element.Attributes.Append(attr); } // recursively load all children. if (!fEmptyElement) { LoadEntityChildren(element); } node = element; break; } case XmlNodeType.Attribute: if (reader.IsDefault) { XmlUnspecifiedAttribute attr = new XmlUnspecifiedAttribute(reader.Prefix, reader.LocalName, reader.NamespaceURI, this.doc); LoadEntityAttributeChildren(attr); attr.SetSpecified(false); node = attr; } else { XmlAttribute attr = new XmlAttribute(reader.Prefix, reader.LocalName, reader.NamespaceURI, this.doc); LoadEntityAttributeChildren(attr); node = attr; } break; case XmlNodeType.SignificantWhitespace: node = new XmlSignificantWhitespace(reader.Value, this.doc); break; case XmlNodeType.Whitespace: if (preserveWhitespace) { node = new XmlWhitespace(reader.Value, this.doc); } else { // if preserveWhitespace is false skip all subsequent WS nodes and position on the first non-WS node do { if (!reader.Read()) { return(null); } } while (reader.NodeType == XmlNodeType.Whitespace); node = LoadEntityChildren(); // Skip WS node if preserveWhitespace is false } break; case XmlNodeType.Text: node = new XmlText(reader.Value, this.doc); break; case XmlNodeType.CDATA: node = new XmlCDataSection(reader.Value, this.doc); break; case XmlNodeType.EntityReference: { XmlEntityReference eref = new XmlEntityReference(reader.Name, this.doc); if (reader.CanResolveEntity) { reader.ResolveEntity(); LoadEntityChildren(eref); //what if eref doesn't have children at all? should we just put a Empty String text here? if (eref.ChildNodes.Count == 0) { eref.AppendChild(new XmlText("")); } } node = eref; break; } case XmlNodeType.ProcessingInstruction: node = new XmlProcessingInstruction(reader.Name, reader.Value, this.doc); break; case XmlNodeType.Comment: node = new XmlComment(reader.Value, this.doc); break; default: throw new InvalidOperationException(string.Format(Res.GetString(Res.Xdom_Load_NodeType), reader.NodeType.ToString())); } return(node); }