4

私はc#.Netで作業しています

質問があります、

で Xml ファイルを読み込んXDocument.xDoc.Load(file)でいますが、コンテンツに xml タグもあるために失敗します。

例:<root><abc><deg></abc></root>

私の問題は、関数が一致する " " なしで Xml タグとしてLoad扱うことです...<deg></deg>

私の質問は、「deg」の「<」と「>」を一致する「&lt;" " &gt;」に最も簡単な方法で置き換えるにはどうすればよいですか?

注意: 私のファイルは非常に大きく、タグがたくさんあります...

ありがとう!

4

4 に答える 4

2

あなたがやろうとしていることは、多くの難しい解析を行いたくない限り、標準の .NET ライブラリで行うのは困難です。終わりのないタグに韻や理由がある場合、それは大いに役立ちます. たとえば、閉じられていないタグの既知のリストはありますか? もしそうなら、検索と置換は悪くないでしょう。

しかし、それが本当にオープンエンドで、タグが閉じられていない場合は、 HTML Tidyのようなものを使用する必要があります。これの .Net ラッパーは、ここにあります。この解決策により、<deg>タグは に変換され<deg/>ます。HTML Tidy ラッパーは、xml の不正な形式を引き起こす他のいくつかの問題を修正することもできます

ファイルに整形式の xml が含まれていると、それを xml オブジェクトに簡単にロードできます。その後、ドキュメントに対して他に行う作業がある場合は、少なくともxml として表示することができます。

于 2010-01-19T23:56:54.553 に答える
1

標準の正規表現の免責事項はここにあります... - HTML クリーンアップのシナリオで役立つ場合があります。

このアプローチを試してみてください:

string input = "<root><abc><deg><foo></abc><bar></root>";
string pattern = @"(<(?<tag>\w+)>)(?!.*?</\k<tag>>)";
string result = Regex.Replace(input, pattern,
                         match => HttpUtility.HtmlEncode(match.Value));
XDocument document = XDocument.Parse(result);
Console.WriteLine(document.ToString());

もちろん、ファイル サイズに注意してください。プロセス全体でパフォーマンスが重要な場合は、他の提案がより適している可能性があります。

編集: Html Agility Packは、不正なコンテンツをサニタイズするための代替オプションです。コンテンツがわかっている場合は、そこに移動して、有効な終了タグに置き換えることができます。

于 2010-01-20T00:09:52.373 に答える
0

にロードする前にそのセクションに到達できる場合XmlDocumentは、メソッドを使用しHttpUtility.HtmlEncodeてコンテンツをエンティティエスケープできます。

考慮すべきもう 1 つのことは、XML に見えるコンテンツを としてラップすることですCDATA。これにより、このコンテンツがパーサーから効果的に隠されます。

于 2010-01-19T23:27:09.333 に答える
0

このファイルが非常に大きい場合は、XmlDocument の代わりに XmlReader を使用する必要があり、「閉じられていないタグ」の問題はありません。

http://msdn.microsoft.com/en-us/library/system.xml.xmlreader%28VS.80%29.aspx

例: C# 3.5 で大きな XML ファイルのストリーミング読み取りを行う方法

于 2010-01-20T00:05:11.057 に答える