title: With latest NativeXml (v4.03 svn), is it possible to get the element's value with the preceding and trailing blanks without checking type iteratively?
body: <p>As shown below, the latest NativeXml (v4.03 svn) sees the element's value as three parts: the preceding blank, the char data, and the trailing blank. Therefore, one could check the element's child nodes iteratively to get the value with preceding and trailing blanks. However, this isn't necessary with legacy NativeXml (v3.10), and I thus wonder what is the preferred way (perhaps without such iteratively checking/string concatenation) to do this? </p>
  
  <h3>sample XML document</h3>
  
  <pre><code>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
  &lt;CDXML&gt;&lt;s&gt;beforeLineBreak
  &lt;/s&gt;&lt;/CDXML&gt;
  </code></pre>
  
  <h3>sample XML document</h3>
  
  <pre><code>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
  &lt;CDXML&gt;&lt;s&gt;
  afterLineBreak&lt;/s&gt;&lt;/CDXML&gt;
  </code></pre>
  
  <h3>sample code using NativeXml v3.10 that doesn't need iteratively checking</h3>
  
  <pre><code>procedure XXX310;
  var
    element: TXmlNode; 
    elementType: TElementType;
  begin
    elementType := element.ElementType;
    element.ElementType := xeCharData;
    ... element.ValueAsString ...
    element.ElementType := elementType;      
  end;
  </code></pre>
  
  <h3>related source code of NativeXml v3.10 (complete method body)</h3>
  
  <pre><code>function TXmlNode.GetValueAsString: UTF8String;
  begin
    if FElementType = xeNormal then
      Result := UnEscapeString(sdUTF8Trim(FValue))
    else
      Result := UnEscapeString(FValue);
  end;
  </code></pre>
  
  <h3>sample code using NativeXml v4.03 svn that needs iteratively checking</h3>
  
  <pre><code>procedure XXX403;
  var
    tempString: String;
    element: TXmlNode; // actually TsdElement
  begin
    tempString := '';
    for I := element.DirectNodeCount to element.NodeCount - 1 do
      if element.Nodes[I] is TsdCharData then
         tempString := tempString + (element.Nodes[I] as TsdCharData).Value;
  
    ... tempString ...
  end;
  </code></pre>
  
  <h3>related source code of NativeXml v4.03 svn (incomplete type declaration or method body)</h3>
  
  <pre><code>unit NativeXml;
  interface
  
    // TXmlNode is the ancestor for all nodes in the xml document. See TsdElement
    // for the elements, TsdAttribute for the attributes.
    TXmlNode = class(TDebugPersistent)
    Public
      // The value of the node. For elements this is the element value (based on
      // first chardata fragment), for attributes this is the attribute value. The
      // string is encoded as UTF8. Use ToWide(Node.Value) or Node.ValueUnicode
      // to get a UnicodeString compatible with "unicode" windows methods.
      property Value: Utf8String read GetValue write SetValue;
    end;
  
    // Node representing an xml element.
    TsdElement = class(TsdContainerNode)
    protected
      // parses the value in descendants TsdElement and TsdDocType
      procedure ParseIntermediateData(P: TsdXmlParser); override;
    end;
  
  implementation
  
  function TsdElement.GetValue: Utf8String;
  begin
    // Return the value of the CharData subnode designated by the parser
    if (FValueIndex &gt;= 0) and (FValueIndex &lt; FNodes.Count) then
    begin
      // chardata value at FValueIndex
      // This calls TsdCharData.GetValue(),
      // then TsdCharData.GetCoreValue().
      Result := FNodes[FValueIndex].Value;
  
      // do un-normalisation if mac/windows
      if GetEolStyle &lt;&gt; esLF then
        Result := sdUnNormaliseEol(Result, GetEolStyle);
  
    end else
      // default value
      Result := '';
  end;
  
  procedure TsdElement.ParseIntermediateData(P: TsdXmlParser);  
  begin  
    CharDataString := sdTrim(S, PreString, PostString);
  
    if GetPreserveWhiteSpace and (Length(PreString) &gt; 0) then
    begin
      WhiteSpaceNode := TsdWhiteSpace.Create(TNativeXml(FOwner));
    end;
  
    if length(CharDataString) &gt; 0 then
    begin
      // Insert CharData node
      CharDataNode := TsdCharData.Create(TNativeXml(FOwner));
    end;  
  
    if GetPreserveWhiteSpace and (Length(PostString) &gt; 0) then
    begin
      WhiteSpaceNode := TsdWhiteSpace.Create(TNativeXml(FOwner));
    end;
  end;
  
  end.  
  </code></pre>