C# Regex в XML файле - PullRequest
       10

C# Regex в XML файле

0 голосов
/ 02 мая 2020

У меня есть XML файл, который содержит следующую строку несколько раз:

<Name Area="" Title="@(String) - @(I am) - @(looking) - @(for)" ...</Name>

Я пытаюсь найти эти строки с помощью регулярных выражений, вырезать @ () и сохраните остальные в новом текстовом файле. Мне удалось найти шаблон, соответствующий этой строке, посчитать, как часто этот шаблон соответствует этой строке, но мне не удается выбрать и манипулировать ими.

Я делаю все это в Windows Form-App .

РЕДАКТИРОВАТЬ:

Мортен Борк:

Единственное, что мне удалось сделать до сих пор, это позволить пользователю выбирать, над каким файлом работать и где сохранять новый. И это делает это. Я просто ошибаюсь с мыслью об использовании регулярных выражений.

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Diagnostics;
    using System.Text.RegularExpressions;

    namespace Movitool
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            public static class Globals
            {
                public static string AlrFile = string.Empty;
                public static string AlrFileNeu = string.Empty;
            }

            private void btnPfadAuswahl_Click(object sender, EventArgs e)
            {

                using (OpenFileDialog fileDialog1 = new OpenFileDialog())
                {
                    fileDialog1.Filter = "movalr files (*.movalr)|*.movalr";
                    fileDialog1.RestoreDirectory = true;
                    fileDialog1.InitialDirectory = @"Dokumente\";

                    if (fileDialog1.ShowDialog() == DialogResult.OK)
                    {
                        Globals.AlrFile = fileDialog1.FileName;
                        txtPfad.Text = Globals.AlrFile; 
                    }
                }
            }

            private void btnStartAlr_Click(object sender, EventArgs e)
            {
                string pattern = @"@(.*?)";
                Regex rgx = new Regex(pattern);

                using (SaveFileDialog fileDialog2 = new SaveFileDialog())
                {
                    fileDialog2.InitialDirectory = @"Dokumente";
                    fileDialog2.Title = "Save File";
                    fileDialog2.Filter = "txt files (*.txt)|*.txt";

                    if(fileDialog2.ShowDialog() == DialogResult.OK)
                    {
                        Globals.AlrFileNeu = fileDialog2.FileName;
                    }
                }

                foreach(string Line in File.ReadLines(Globals.AlrFile))                     
                {
                    File.AppendAllText(Globals.AlrFileNeu, Line + Environment.NewLine);     
                }

                lblStatus.Text = "Fertig!";
            }
        }
    }

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Ответ на последний комментарий jdweng:

Да, я попробовал ваш код. Я тоже пытался смешать это с ответом Тима, который говорит использовать XDocument. Сейчас я попробовал следующее:

            XmlReader xr = new XmlTextReader(Globals.AlrFile);

            lblMatches.Text = "";
            while (xr.Read())
            {
                if(xr.NodeType == XmlNodeType.Element)
                {
                    if(xr.AttributeCount > 0)
                    {
                        while(xr.MoveToNextAttribute())
                        {
                            string input = Convert.ToString(xr.Value);
                            string pattern = @"(?'start'@\()(?'middle'[^\)]+)(?'end'\))";
                            string output = Regex.Replace(input, pattern, "${middle}");

                            File.AppendAllText(Globals.AlrFileNeu, output + Environment.NewLine);
                        }
                    }
                }
            }

            xr.Close();

Но мой вклад от xml таков:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<Alarms>
<AlarmList>
<Alarm>
<Name Device="" Variable="" Area="1" ThresholdExclusive="0" Enabled="1" OnQualityGood="1" VariableDuration="0" EnableVariable="" EnableDispMsg="" Hysteresis="0" EventsCache="1024"></Name>
<ThresholdList>
<Threshold>
<Name Area="" Title="@(My) - @(Searched) - @(String)" Help="" DurationFormat="" ReadAccessLevel="4294901760" WriteAccessLevel="4294901760">On</Name>
<Execution Condition="2" Threshold="1" ThresholdVar="" ThresholdLow="0" ThresholdVarLow="" VariableStatus="" Severity="10" SeverityVar="" SecDelay="0" RunCommandAtServer="0"/>
<Commands/>
<CommandsOn/>
<CommandsAck/>
<CommandsReset/>
<CommandsOff/>
<Style BackColor="4294967295" TextColor="65535" BlinkBackColor="4294967295" BlinkTextColor="4294967295" Print="1" Log="1" BlinkOnNewAlarm="0" VarTimeStamp="0" SupportAck="0" SupportReset="0" SupportResetConditionOn="0" BmpFile="" SndFile="" BeepEnabled="0" SpeechEnabled="0" RepeatSpeechEverySec="0" EnableSpeechVariable="" PlaysoundContinuosly="0" CommentOnAck="0"/>
<Recipient Attachment="" DispatchingText=""/>
<SendEmail SendON="0" SendACK="0" SendRESET="0" SendOFF="0"/>
<SendVoice SendON="0" SendACK="0" SendRESET="0" SendOFF="0"/>
<SendSMS SendON="0" SendACK="0" SendRESET="0" SendOFF="0"/>
<SendFax SendON="0" SendACK="0" SendRESET="0" SendOFF="0"/>
<SendAdminAlert SendON="0" SendACK="0" SendRESET="0" SendOFF="0"/>
<SendMessenger SendON="0" SendACK="0" SendRESET="0" SendOFF="0"/>
<ScriptCode StartSel="0" SelLength="0" OutStatusBar="1" OutLog="1" OutPrinter="1">
</ScriptCode>
</Threshold>
</ThresholdList>
</Alarm>
</AlarmList>
</Alarms>

И Ouptut, который я получаю в моем новом текстовом файле, это :

1
0
1
1
0


0
1024

My - Searched - String


4294901760
4294901760
2
1

0


10

0
0
4294967295
65535
4294967295
4294967295
1
1
0
0
0
0
0


0
0
0

0
0


0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1

И моя проблема в том, что мне нужен только текст между атрибутом Title, и у меня есть несколько элементов Alarm для go через.

0 голосов
/ 02 мая 2020

Попробуйте следующее:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
        static void Main(string[] args)
        {
            string input = File.ReadAllText(FILENAME);

            string pattern = @"(?'start'@\()(?'middle'[^\)]+)(?'end'\))";

            string output = Regex.Replace(input, pattern, "${middle}");

        }
    }
}

Вот вывод с использованием ваших данных

<?xml version="1.0" encoding="ISO-8859-1" ?>
<Alarms>
<AlarmList>
<Alarm>
<Name Device="" Variable="" Area="1" ThresholdExclusive="0" Enabled="1" OnQualityGood="1" VariableDuration="0" EnableVariable="" EnableDispMsg="" Hysteresis="0" EventsCache="1024"></Name>
<ThresholdList>
<Threshold>
<Name Area="" Title="My - Searched - String" Help="" DurationFormat="" ReadAccessLevel="4294901760" WriteAccessLevel="4294901760">On</Name>
<Execution Condition="2" Threshold="1" ThresholdVar="" ThresholdLow="0" ThresholdVarLow="" VariableStatus="" Severity="10" SeverityVar="" SecDelay="0" RunCommandAtServer="0"/>
<Commands/>
<CommandsOn/>
<CommandsAck/>
<CommandsReset/>
<CommandsOff/>
<Style BackColor="4294967295" TextColor="65535" BlinkBackColor="4294967295" BlinkTextColor="4294967295" Print="1" Log="1" BlinkOnNewAlarm="0" VarTimeStamp="0" SupportAck="0" SupportReset="0" SupportResetConditionOn="0" BmpFile="" SndFile="" BeepEnabled="0" SpeechEnabled="0" RepeatSpeechEverySec="0" EnableSpeechVariable="" PlaysoundContinuosly="0" CommentOnAck="0"/>
<Recipient Attachment="" DispatchingText=""/>
<SendEmail SendON="0" SendACK="0" SendRESET="0" SendOFF="0"/>
<SendVoice SendON="0" SendACK="0" SendRESET="0" SendOFF="0"/>
<SendSMS SendON="0" SendACK="0" SendRESET="0" SendOFF="0"/>
<SendFax SendON="0" SendACK="0" SendRESET="0" SendOFF="0"/>
<SendAdminAlert SendON="0" SendACK="0" SendRESET="0" SendOFF="0"/>
<SendMessenger SendON="0" SendACK="0" SendRESET="0" SendOFF="0"/>
<ScriptCode StartSel="0" SelLength="0" OutStatusBar="1" OutLog="1" OutPrinter="1">
</ScriptCode>
</Threshold>
</ThresholdList>
</Alarm>
</AlarmList>
</Alarms>

Вот только измененные заголовки с использованием xml linq

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            string pattern = @"(?'start'@\()(?'middle'[^\)]+)(?'end'\))";

            foreach(XElement xTitle in doc.Descendants("Name").Where(x => x.Attribute("Title") != null))
            {
                string title = (string)xTitle.Attribute("Title");
                Console.WriteLine("Title : " + Regex.Replace(title, pattern, "${middle}"));
            }
            Console.ReadLine();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...