使用最新的NativeXml(v4.03 svn),是否可以获取元素';是否在不反复检查类型的情况下,使用前面和后面的空格替换s值?

使用最新的NativeXml(v4.03 svn),是否可以获取元素';是否在不反复检查类型的情况下,使用前面和后面的空格替换s值?,xml,delphi,whitespace,nativexml,Xml,Delphi,Whitespace,Nativexml,如下所示,最新的NativeXml(v4.03 svn)将元素的值视为三部分:前面的空白、char数据和后面的空白。因此,可以迭代地检查元素的子节点,以获得带有前后空格的值。然而,对于遗留的NativeXml(v3.10)来说,这是不必要的,因此我想知道做这件事的首选方法是什么(也许没有这种迭代检查/字符串连接) 示例XML文档 NativeXml v3.10的相关源代码(完整的方法体) 使用需要迭代检查的NativeXml v4.03 svn的示例代码 NativeXml v4.03 svn的

如下所示,最新的NativeXml(v4.03 svn)将元素的值视为三部分:前面的空白、char数据和后面的空白。因此,可以迭代地检查元素的子节点,以获得带有前后空格的值。然而,对于遗留的NativeXml(v3.10)来说,这是不必要的,因此我想知道做这件事的首选方法是什么(也许没有这种迭代检查/字符串连接)

示例XML文档 NativeXml v3.10的相关源代码(完整的方法体) 使用需要迭代检查的NativeXml v4.03 svn的示例代码 NativeXml v4.03 svn的相关源代码(不完整的类型声明或方法体)
unitnativexml;
接口
//TXmlNode是xml文档中所有节点的祖先。见T删除
//对于元素,属性为TsdAttribute。
TXmlNode=class(TDebugPersistent)
公开的
//节点的值。对于元素,这是元素值(基于
//第一个chardata片段),对于属性,这是属性值。这个
//字符串编码为UTF8。使用ToWide(Node.Value)或Node.ValueUnicode
//获取与“unicode”windows方法兼容的unicode解构。
属性值:Utf8String读取GetValue写入SetValue;
结束;
//表示xml元素的节点。
TSDELENT=类(TsdContainerNode)
受保护的
//分析子体tsdelelement和TsdDocType中的值
过程ParseMediateData(P:TsdXmlParser);推翻
结束;
实施
函数TsdElement.GetValue:Utf8String;
开始
//返回解析器指定的CharData子节点的值
如果(FValueIndex>=0)和(FValueIndex0),则
开始
WhiteSpaceNode:=TsdWhiteSpace.Create(TNativeXml(FOwner));
结束;
如果长度(CharDataString)>0,则
开始
//插入CharData节点
CharDataNode:=TsdCharData.Create(TNativeXml(FOwner));
结束;
如果GetPreserveWhiteSpace和(长度(PostString)>0),则
开始
WhiteSpaceNode:=TsdWhiteSpace.Create(TNativeXml(FOwner));
结束;
结束;
结束。

我认为这是NativeXML中的一个错误。我会向他们报告,并等待他们的反应。我使用NativeXML多年来取得了巨大成功,但去年当我超越Delphi 2007并需要升级时,我们在新版本上遇到了许多问题。当时开发人员没有时间处理组件(这可能已经改变),所以我们转到OXML()@jeroenviertpluimers“bug”在从官方网站下载的最新版本v3.32中得到修复:)所以你从4.03降到了3.32?@Jeroenviertplumers显然作者改变了他的版本控制方案。最新的v3.32看起来像旧的v4,但有缺陷修复和未来的维护。
<?xml version="1.0" encoding="UTF-8" ?>
<CDXML><s>beforeLineBreak
</s></CDXML>
<?xml version="1.0" encoding="UTF-8" ?>
<CDXML><s>
afterLineBreak</s></CDXML>
procedure XXX310;
var
  element: TXmlNode; 
  elementType: TElementType;
begin
  elementType := element.ElementType;
  element.ElementType := xeCharData;
  ... element.ValueAsString ...
  element.ElementType := elementType;      
end;
function TXmlNode.GetValueAsString: UTF8String;
begin
  if FElementType = xeNormal then
    Result := UnEscapeString(sdUTF8Trim(FValue))
  else
    Result := UnEscapeString(FValue);
end;
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;
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.