Моя проблема: я анализирую кучу журналов на основе XML (над которыми у меня мало контроля) в операторы MySQL, чтобы переключиться с базы данных на основе XML на MySQL. Этот бит поставил меня в тупик.
Если я посмотрю на IEnumerable<XElement>
, содержащий интересующую меня строку, я увижу встроенный оператор XML. Однако, если я возьму значение этой строки, оператор XML исчезнет. НАПРИМЕР:
IEnumerable (<PowerFail />
виден):
<StepDetails>Set input voltage to 2.80V WDT should allow CPU power. CPU should detect PowerFail signal and output a<PowerFail /> tag to the serial line. WDT should reset every 1.6 seconds</StepDetails>
И принимая значение, тег <PowerFail />
отсутствует в строке:
Set input voltage to 2.80V WDT should allow CPU power. CPU should detect PowerFail signal and output a tag to the serial line. WDT should reset every 1.6 seconds
Я получаю то же самое, если делаю .ToString()
Процедура: если вы вставите следующее в LinqPad в виде утверждений C#, вы поймете, что я имею в виду. Тег XML <PowerFail />
исчезнет. Я заметил, что здесь он также исчезает, если я не поставлю вокруг него обратную галочку. Я включил тег LinqPad, потому что именно так я анализирую эти файлы (существуют десятки тысяч файлов журналов за несколько лет). ) с помощью серии сценариев LinqPad для обработки журналов в MySQL и вставки их для создания новой базы данных.
Мой вопрос: я понимаю, что могу получить строку с помощью некоторого регулярного выражения или подстроки или чего-то еще, но похоже, что я должен получить всю строку, теги и все из IEnumerable, но как Сделай так? Кроме того, мне любопытно узнать, почему тег проглатывается только для моего назидания.
У меня есть примерно три дюжины вариантов этих типов аномалий журналов, влияющих на десятки тысяч журналов (последний, который я исправил вчера, относился только к 1500+ журналам) за семь лет или около того данных, поэтому я хотел бы найти (больше ) общее решение вместо специального регулярного выражения, подстроки или чего-либо еще для каждого из них. Я не могу изменить журналы и не хочу терять данные при переносе в новую базу данных.
Чтобы просмотреть проблему из первых рук: вырежьте и вставьте в LinqPAD как операторы C# (есть ли онлайн-способ сделать это, аналогичный JSFiddle для JavaScript)? Я добавил решение регулярного выражения внизу на случай, если кто-то придет искать что-то подобное, но меня все еще интересует лучший способ сделать это.
string xml = @"<StepResults>
<TestStep Name='2.8V OPERATION' Result='Pass'>
<OperatorComment/>
<StepDetails>Set input voltage to 2.80V WDT should allow CPU power. CPU should detect PowerFail signal and output a<PowerFail/> tag to the serial line. WDT should reset every 1.6 seconds</StepDetails>
<Measurements NumberOfMeasurements='1'>
<Measurement Name='BATTERY VOLTAGE: VOLTS'>
<MeasuredValue>2.794608</MeasuredValue>
<Min>2.785000</Min>
<Max>2.800000</Max>
</Measurement>
</Measurements>
</TestStep>
</StepResults>";
var xd = XDocument.Parse(xml);
Console.WriteLine(xd);
var xe =
from e in xd.Descendants("StepDetails")
select e;
Console.WriteLine(xe);
Console.WriteLine(xe.First().Value);
//new code below to show a working regex solution:
string stepDetail = xe.First().ToString();
Regex matchFrontTag = new Regex("^<[^>]*>");
Regex matchRearTag = new Regex("<[^>]*>$");
stepDetail = matchFrontTag.Replace(stepDetail,string.Empty);
stepDetail = matchRearTag.Replace(stepDetail,string.Empty);
Console.WriteLine(stepDetail);