8

大きなxmlファイルを解析しています。そのため、XElement.Load() の代わりに XElement と組み合わせて XmlReader を使用しています。

以下とここに示すように、XmlReader から XElement オブジェクトとして作成しました。

static IEnumerable<XElement> StreamRootChildDoc(string uri)
{
    using (XmlReader reader = XmlReader.Create(uri, xmlReaderSettings))
    {
        reader.MoveToContent();
        // Parse the file and display each of the nodes.
        while (reader.Read())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    if (reader.Name == "Child")
                    {
                        XElement el = XElement.ReadFrom(reader) as XElement;
                        if (el != null)
                            yield return el;
                    }
                    break;
            }
        }
    }
}

この XElement オブジェクトのコンテンツを空白なしの文字列としてデータベースに保存したいと考えています。以下の 3 つの方法のいずれも機能しません。XElement.Load() を使用して xml をメモリにロードすると、ToString(SaveOptions.DisableFormatting) が機能します。

<root>  <child></child>  </root> //xml saved in db with whitespace
<root><child></child></root> //want to save as this

XElement.ToString(SaveOptions.DisableFormatting) //
XElement.ToString(SaveOptions.None)
XElement.ToString()

XmlReader オブジェクトに使用している XmlReaderSettings は以下のとおりです。IgnoreWhitespace =true/false を試してみましたが運が悪かったのですが、一部の要素がスキップされるため true に設定できません (スキップの理由については、空白区切りがない場合に XmlReader が他のすべての要素をスキップする理由を参照してください)。

    XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();
    xmlReaderSettings.ProhibitDtd = false;
    //xmlReaderSettings.IgnoreWhitespace = true;//cannot use this setting

XElement オブジェクトを解析すると機能しますが、XElement.Parse() が xml をメモリにロードするため、XmlReader を使用する目的全体が無効になります。

XElement el = XElement.ReadFrom(reader) as XElement;
XElement.Parse(el.ToString(), LoadOptions.None)

空白を削除するにはどうすればよいですか?

編集:これは私がしなければならなかったことです:

  1. 要素のスキップは、2 つの読み取りが原因でreader.Read()ありXElement.ReadFrom(reader)、同じ反復で 1 つおきの要素がスキップされます。上記のリンクに記載されているループを修正すると、それが解決されます。問題は とは何の関係もありませんXmlReaderSettings
  2. xelement.ToString(SaveOptions.DisableFormatting)きれいな書式設定を削除します。
4

1 に答える 1

1

XMLTextReaderクラスからこの例を使用してみてください。XMLTextReaderには「WhitespaceHandling」メソッドがあり、noneに設定できます。テストXMLファイルを提供できた場合は、この質問に答えると、XMLTextReaderが機能するかどうかをテストするのに役立ちます。

于 2011-09-30T23:08:39.877 に答える