5

以下に示すように、最新の NativeXml (v4.03 svn) は、要素の値を 3 つの部分 (前の空白、char データ、および末尾の空白) として認識します。したがって、要素の子ノードを繰り返しチェックして、前後の空白で値を取得できます。ただし、これは従来の NativeXml (v3.10) では必要ありません。したがって、これを行うための好ましい方法 (おそらくそのような反復チェック/文字列連結なし) は何でしょうか?

サンプル XML ドキュメント

<?xml version="1.0" encoding="UTF-8" ?>
<CDXML><s>beforeLineBreak
</s></CDXML>

サンプル XML ドキュメント

<?xml version="1.0" encoding="UTF-8" ?>
<CDXML><s>
afterLineBreak</s></CDXML>

繰り返しチェックする必要のない NativeXml v3.10 を使用したサンプル コード

procedure XXX310;
var
  element: TXmlNode; 
  elementType: TElementType;
begin
  elementType := element.ElementType;
  element.ElementType := xeCharData;
  ... element.ValueAsString ...
  element.ElementType := elementType;      
end;

NativeXml v3.10 の関連ソース コード (完全なメソッド本体)

function TXmlNode.GetValueAsString: UTF8String;
begin
  if FElementType = xeNormal then
    Result := UnEscapeString(sdUTF8Trim(FValue))
  else
    Result := UnEscapeString(FValue);
end;

繰り返しチェックが必要な NativeXml v4.03 svn を使用したサンプル コード

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;

NativeXml v4.03 svnの関連ソースコード(型宣言やメソッド本体が不完全)

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 >= 0) and (FValueIndex < 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 <> 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) > 0) then
  begin
    WhiteSpaceNode := TsdWhiteSpace.Create(TNativeXml(FOwner));
  end;

  if length(CharDataString) > 0 then
  begin
    // Insert CharData node
    CharDataNode := TsdCharData.Create(TNativeXml(FOwner));
  end;  

  if GetPreserveWhiteSpace and (Length(PostString) > 0) then
  begin
    WhiteSpaceNode := TsdWhiteSpace.Create(TNativeXml(FOwner));
  end;
end;

end.  
4

0 に答える 0