public override Expression Scalar(Expression valueType, BondDataType expectedType, ValueHandler handler) { var stringValue = Expression.Variable(typeof(string), "valueAsString"); // Reading primitive field of a struct, or a primitive list item - value is in Xml element text. // If we have an empty element, parse it as if it has an empty text. // Otherwise: read once to get to the text, handle the text, read once more to get to the end element. return(Expression.Block( new[] { stringValue }, Expression.IfThenElse( Reader.IsEmptyElement, Expression.Assign(stringValue, StringExpression.Empty()), Expression.Block( Reader.Read(), Expression.IfThenElse( Expression.Equal(Reader.NodeType, Expression.Constant(XmlNodeType.EndElement)), Expression.Assign(stringValue, Expression.Constant(string.Empty)), Expression.Block( IfNotNodeType(XmlNodeType.Text, IfNotNodeType(XmlNodeType.Whitespace, ParsingError())), Expression.Assign(stringValue, Reader.Value), Reader.Read(), IfNotNodeType(XmlNodeType.EndElement, ParsingError()))))), handler(StringExpression.Convert(stringValue, expectedType)))); }