以下に示すように、最新の 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.