【问题标题】:Remove spaces and line breaks of a xml file删除 xml 文件的空格和换行符
【发布时间】:2014-05-23 16:50:34
【问题描述】:

我从 web 服务收到一个 xml 文件,但它带有换行符和标签之间的空格,我需要删除它们并将 xml 放在一行中的字符串中。 我已经尝试过使用 TXMLDocument,但我只能替换制表符的空格。

xml示例:

<CompNfse xmlns="http://www.sistema.com.br/Nfse/arquivos/nfse_3.xsd">'#$D#$A'      <Nfse versao="">'#$D#$A'        <InfNfse Id=" 00000000000670">'#$D#$A'          <Numero>10</Numero>.....

使用 TXMLDocument

<CompNfse xmlns="http://www.sistema.com.br/Nfse/arquivos/nfse_3.xsd">'#$D#$A#9'<Nfse versao="">'#$D#$A#9#9'<InfNfse Id=" 00000000000670">'#$D#$A#9#9#9'<Numero>10</Numero>....

我需要多少

<CompNfse xmlns="http://www.sistema.com.br/Nfse/arquivos/nfse_3.xsd"><Nfse versao=""><InfNfse Id=" 00000000000670"><Numero>10</Numero>....

我试过的代码。

var sTemp : String;
oXml : TXMLDocument;
begin
  try
    sTemp := '<Nfse versao="">'+#13#10+'        <InfNfse Id=" 00000000000670">'+#13#10+'          <Numero>10</Numero>'+#13#10+'              <CodigoVerificacao>82557.2TE79</CodigoVerificacao></InfNfse></Nfse>';
    oXml := TXMLDocument.Create(nil);
    oXml.Options := [];
    oXml.ParseOptions := [];
    oXml.LoadFromXML(sTemp);
    sTemp := oXml.XML.Text;
  finally
    oXml := nil;
  end;
end;

【问题讨论】:

  • 您到底为什么“需要”将 XML 强制放在一行上? (1) XML 标准特别要求可以在不影响数据含义的情况下添加或删除空格。 (2) 如果您(或客户)有一个无法处理额外空格的 XML 解析器:摆脱那个解析器!从长远来看,解析器只会让生活变得困难。 (3) 实际上,带有空格和换行符的 XML 有一个优势:在紧要关头,它可以在记事本等糟糕的编辑器中读取...... 您永远不应该对 XML 的格式大惊小怪- 这是浪费时间.
  • 为什么需要删除空格?它是合法的 XML,你仍然可以解析它。
  • 因为我需要使用第三方组件来读取xml并且不读取带有空格和刹车线的数据。
  • 空白处理从一开始就在 XML 中。如果组件的一致性不足以忽略它,请查找另一个组件。
  • Rigotti 我同意@Remy :如果第三方组件不能处理valid XML,那么不要使用该组件。或者联系供应商并告诉他们修复它。说真的,补偿供应商的错误不值得你花时间。您所做的任何事情都只会使您自己的流程复杂化:减慢速度并增加出现错误的机会......请听我的建议:这是为了您自己的利益

标签: xml delphi delphi-2010


【解决方案1】:

TXMLDocument.Options 属性中删除doNodeAutoIndent 标志,并从TXMLDocument.ParseOptions 属性中删除poPreserveWhiteSpace 标志。

【讨论】:

  • 没有工作,或者我做错了什么。向问题添加代码
  • 更改ParseOptions before 加载 XML,而不是 after。如果在解析完成后更改解析选项是没有用的。另外,请阅读TXMLDocument 文档。当您使用 nil Owner 创建TXMLDocument 的实例时,它充当引用计数接口,因此您需要使用IXMLDocument 变量而不是TXMLDocument 变量来维护该引用计数。您的代码正在泄漏 TXMLDocument 对象,假设它没有遇到解析节点上的内部引用的其他问题。
猜你喜欢
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多