大きな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)
空白を削除するにはどうすればよいですか?
編集:これは私がしなければならなかったことです:
- 要素のスキップは、2 つの読み取りが原因で
reader.Read()
ありXElement.ReadFrom(reader)
、同じ反復で 1 つおきの要素がスキップされます。上記のリンクに記載されているループを修正すると、それが解決されます。問題は とは何の関係もありませんXmlReaderSettings
。 xelement.ToString(SaveOptions.DisableFormatting)
きれいな書式設定を削除します。