【问题标题】:Save XML like XmlTextWriter but with DOM像 XmlTextWriter 一样保存 XML,但使用 DOM
【发布时间】:2010-10-10 00:27:15
【问题描述】:

当我在 C# 中使用 XmlDocument 构建 XML 时,我想保存到 XML 到文件中,包括编码信息,我使用 XmlTextWriter,如下所示:

    using (StringWriter swr = new StringWriter())
    {
        using (XmlTextWriter xtw = new XmlTextWriter(swr))
        {
            xmlDoc.WriteTo(xtw);
            return swr.ToString();
        }
    }

通过上面的代码,我得到的字符串的语法如下:

<?xml version="1.0" encoding="utf-8"?>
<regs>
  <reg1>
....
  </reg1>
</regs>

我希望使用 IXMLDOMDocument 方法具有相同的行为。在这个场景中,我知道提取 XML 字符串的唯一方法是通过 xmlDoc.xml 方法。但是,使用这种方法,字符串是完全不同的,编码也是如此:

<?xml version="1.0"?>
<regs>
  <reg1>
....
  </reg1>
</regs>

有没有一种方法可以像使用 XmlTextWriter 一样输出 IXMLDOMDocument,并且具有相同的编码结果?
提示

编辑

我用来通过 DOM 生成 XML 的代码在 Delphi 中:

function TXMLClass.GenerateXML: Variant;
var
  iCont: Integer;
  sName, sValor: String;
  vXML: Variant;
  oNodeDados, oNodeCliente, oNodeTransacao: Variant;
  oHeader: Variant;
begin
  vXML := CreateOLEObject('Msxml2.DOMDocument.6.0');
  try
    oHeader := vXML.createProcessingInstruction('xml', 'version=''1.0'' encoding=''utf-8''');
    vXML.AppendChild(oHeader);
    oNodeDados := vXML.CreateElement('regs');
    vXML.AppendChild(oNodeDados);
    oNodeCliente := vXML.CreateElement('reg1');
    oNodeDados.AppendChild(oNodeCliente);
    Result := vXML;
  except
    on e: Exception do
    begin
      vXML := Unassigned;
      Result := vXML;
      raise;
    end;
  end;
end;

我的主要问题是生成的字符串编码,因为我将生成的 WideString 传输到 C# WebService,当我在 XmlDocument 中读取它时,带有任何重音的字符都是错误的。当我在C#中生成XML,通过XmlTextWriter导出,然后发送回Delphi,通过DOM加载,字符是正确的。

编辑

当我使用vXML.Save(file_name.xml) 时,保存的文件编码正确,如果我将它加载到WideString(Delphi 中的Unicode 字符串)中,并将其传输到Web 服务,效果很好。但是,如果不将其保存到磁盘和通过 DOM,我该怎么做呢?

【问题讨论】:

  • 您说的是the string is quite different,但据我在您发布的内容中看到的,唯一的区别是缺少encoding= 声明。
  • Jim,实际上,字符串的结果编码完全不同,这是我主要关心和问题。
  • 我编辑了我的原始帖子,更详细地解释了我的问题。非常感谢您的时间
  • 你试过我提出的建议了吗?

标签: xml msxml xmltextwriter ixmldomdocument


【解决方案1】:

尝试在构造函数中显式传递 Encoding.UTF8 作为第二个参数。见http://msdn.microsoft.com/en-us/library/ms162588(v=VS.80).aspx

【讨论】:

  • 我的问题不是用 XmlTextWriter 来做(效果很好),而是通过 XML DOM 获得相同的输出。但是tks
【解决方案2】:

在访问xml之前,你有没有尝试在根节点上使用setOption(SXH_OPTION_URL_CODEPAGE,Encoding.UTF8)方法?

编辑:现在我更好地理解了这个问题。写出 xml 字符串时必须正确设置编码。这是一个非常常见的问题:在 XML 标头中设置编码实际上不会导致输出与声明的编码匹配。您必须配置 writer(或任何写入输出流的对象)才能实际生成 UTF8。

【讨论】:

  • 我发布了生成 DOM XML 的代码,但我认为 setOption 不能解决我的问题。但是感谢您的时间
  • 是的,完全正确...抱歉,如果我措辞错误。我的问题是如何使用 DOM 做到这一点? Tks
【解决方案3】:

我回答了一个类似的问题here

使用 MSXML,当您保存文件时,编码也会被写出。但是,当您使用 xml 属性时,将不包含编码。这是有意设计的。他们以这种方式设计它,因此您可以转身并在字符串上调用LoadXml,它会起作用。如果包含编码,您将收到错误Switch from current encoding to specified encoding not supported。尝试通过调用Save 方法保存文档。您将看到包含编码。

更新:

我不在可以测试的地方,但是 Save 方法可以采用多种类型的参数。一个是实现 IStream 接口的对象。因此,您可以使用 ADODB.Stream 对象。我不了解 Delphi,所以我会写出要采取的步骤。

【讨论】:

  • 加勒特,用Save,它工作得很好,但是我必须保存到磁盘,并将文件加载到Dlephi中的WideString,然后通过WebService传输,所以它被正确加载在里面使用 LoadXML。我如何在不将其保存到磁盘和通过 DOM 的情况下做到这一点?谢谢你的时间
  • Garett,事实证明,问题实际上并不在于保存 XML 部分……而是传输到 C# Web 服务部分(发布 stackoverflow.com/questions/3902259/…)。谢谢你的时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多