如下所示,最新的 NativeXml (v4.03 svn) 将元素的值分为三部分:前面的空白、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.