1

XML構造からすべての属性を削除したいと思います。私の選択は正規表現ですが、もっと簡単な方法があれば、私は提案を広く受け入れています。

単一のタグを選択するために、私は以下を使用しました。

String clean = Regex.Replace(filled, ".*?<holder[^>]*?>(.*?)</holder>.*?", "$1");

これで、タグホルダーの内容がわかります。ここで、テキストの質量を維持したいのですが、内部タグのすべての属性を省略します。私は次のアプローチを試しました。

String plain1 = Regex.Replace(clean, "(<[^>]*?>)(.*?)(</[^>]*?>)", "$1$2$3");
String plain2 = Regex.Replace(clean, "(<[a-zA-Z]*?)([^>]*?)(>)", "$1$3");

しかし、それは私にまったく同じもの(plain1)と元の名前のない空のタグ(plain2)を返します。何もクリーンアップされていないか、すべてがクリーンアップされています。私は何を間違えますか?

プラスの開始を変更すると、名前の最初の文字のみを含むタグが表示されることに気付いたので、 1ドルでピックアップセクションを作成できる限り、次の方法が正しい方法であると確信しています。最大限に大きい。それ、どうやったら出来るの?

String plain3 = Regex.Replace(clean, "(<[a-zA-Z]+?)([^>]*?)(>)", "$1$3");
4

3 に答える 3

2

最初の括弧内の疑問符はスキップする必要があります。

String plain3 = Regex.Replace(clean, "(<[a-zA-Z]+)([^>]*?)(>)", "$1$3");

いくつかの観察。

  • 終了タグを処理する必要があります。現在、スラッシュ文字をスキップしています。
Regex.Replace(clean, "(<[/a-zA-Z]+)([^>]*?)(>)", "$1$3");
  • $2は必要ありません。実際には3ドルではありません。
Regex.Replace(clean, "(<[a-zA-Z]+)[^>]*?>", "$1>");
  • 正規表現で「文字のみ」を表現するためのより良い方法があります。
Regex.Replace(clean, @"(<[\w]+)([^>]*?)(>)", "$1$3");

したがって、最終的には、次のようになる可能性があります。

Regex.Replace(clean, @"(<[/\w]*)[^>]*?>", "$1>");
于 2013-03-23T22:46:29.187 に答える
1

これには正規表現を使用しないでください。

純粋な XML でそれを実現する方法のサンプルを次に示します (前半は単なるコンソール関連のものであり、必要なメソッドは ProcessNode です)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;

internal static class Program
{
    public static void Main(string[] args)
    {
        var xmlFile = XElement.Load(@"c:\file.xml"); // Use your file here
        var blockquote = xmlFile.XPathSelectElement("/");

        var doc = new XDocument();
        doc.Add(new XElement("root"));
        var processedNodes = ProcessNode(blockquote);
        foreach (var node in processedNodes)
        {
            doc.Root.Add(node);
        }

        var sb = new StringBuilder();
        var settings = new XmlWriterSettings();
        settings.OmitXmlDeclaration = true;
        settings.Encoding = Encoding.UTF8;
        settings.Indent = true;
        using (var sw = XmlWriter.Create(sb, settings))
        {
            doc.WriteTo(sw);
        }

        Console.OutputEncoding = Encoding.UTF8;
        Console.WriteLine(sb);
    }

    private static IEnumerable<XNode> ProcessNode(XElement parent)
    {
        foreach (var node in parent.Nodes())
        {
            if (node is XText)
            {
                yield return node;
            }
            else if (node is XElement)
            {
                var container = (XElement)node;
                var copy = new XElement(container.Name.LocalName);
                var children = ProcessNode(container);
                foreach (var child in children)
                {
                    copy.Add(child);
                }
                yield return copy;
            }
        }
    }
}
于 2013-03-23T23:18:41.563 に答える