0

このような手法を使用して、Xml ファイルのディレクトリを XmlDocument オブジェクトに読み込みます。

private static void StripAttributes(string filePath)
    {
        Contract.Requires(filePath != null);
        var xmlDocument = new XmlDocument();
        var encode = Encoding.GetEncoding("ISO-8859-1");
        using (var sr = new StreamReader(filePath, encode))
        {
            xmlDocument.Load(sr);
        }

これは機能しますが、出力された Xml をテキスト エディターでレンダリングすると、属性が一重引用符で囲まれ、子ノードが別の行に表示されます。

前の例:

<xml>
  <xml2>
     <xmlField id='foo' string='bar'><xmlValue>foobar</xmlValue></xmlField>
  </xml2>
</xml>

フォーマット後の例:

<xml>
  <xml2>
     <xmlField id="foo">
        <xmlValue>foobar</xmlValue>
     </xmlField>
  </xml2>
</xml>

比較のために、元の形式を同じままにする必要があります。

Xml の元の形式を保持する方法についてのアイデアはありますか?

4

2 に答える 2

0

おそらくあなたはできません!xml レンダリングの Microsoft.Net 実装では、レンダラーは常に出力を再フォーマットします。任意の種類の設定を含む XmlDocument または XDocument のいずれか。私たちのプロジェクトの 1 つ (トルコの Efatura) では、xml ファイルは xades 署名されており、変更しないでください。何も変更せずにレンダリングして保存するだけで、xml ファイル内の何かが変更され、署名が無効になることがわかりました。また、たとえば、入力 xml が 1 行のみ (空白なし) の場合、パーサー (すべて) はドキュメントの解析に失敗します。私たちが観察した効果は、パーサーがそこにないかのように動作するいくつかの要素を見逃すことです。

あなたの状況では、他の xml 実装を使用することをお勧めします。私たちの場合、sth を変更する必要がないため、最初にすべての文字列を個別に保持してから、ドキュメントのコピーを解析してそこから情報を抽出します。終わったらゴミに出す。

単一行の xml の場合、XmlReader を使用しましたが、一致メカニズムを変更しました。

于 2015-07-09T16:51:14.697 に答える
0

空白

最初の問題は空白です。XML では、これは通常重要ではないため、デフォルトで、ここに表示されXmlDocumentている重要な空白が正規化されます。

この動作を変更するにはPreserveWhitespace = true、XML をロードする前に次のように設定します。

var xmlDocument = new XmlDocument
{
    PreserveWhitespace = true
};

名言

2番目の問題は、引用文字に関連しています。シングルまたはダブルが有効ですが、.NET のデフォルトはダブルです。XmlWriterどちらの DOM も、このデフォルトを使用する内部的に を使用して XML を書き換えます。もちろん、独自のXmlWriterインスタンスを指定することもできます。

ガイダンスは、XmlWriter.Createファクトリ メソッドを使用しXmlWriterSettings、 を使用して機能を指定することですが、この場合は機能しません。のインスタンスを明示的に作成し、以下XmlTextWriterを変更する必要がありQuoteCharます。

var writer = new XmlTextWriter(fileName, encoding)
{
    QuoteChar = '\''
};

using (writer)
{
    xmlDocument.WriteTo(writer);
}

XML へのリンク

余談ですが、古いXmlDocumentAPI の代わりに LINQ to XML を検討することを強くお勧めします。で同様の動作を得るには、次のXDocumentように解析して記述します。

var doc = XDocument.Load(filePath, LoadOptions.PreserveWhitespace);
doc.WriteTo(writer);

コードが示唆するように、属性を削除する場合、次のような単純なコードは、 namestringを持つ要素からname を持つすべての属性を削除しxmlFieldます。

doc.Descendants("xmlField")
    .SelectMany(e => e.Attributes("string"))
    .Remove();
于 2015-07-09T16:35:44.823 に答える