Nano Hash - криптовалюты, майнинг, программирование

XElement .Value поглощает встроенный XML

Моя проблема: я анализирую кучу журналов на основе 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);
12.08.2014

  • Если я правильно вас понял, вы ищете InnerXml XElement. В этом случае см. этот вопрос: stackoverflow.com/questions/3793/ 12.08.2014
  • Онлайн-инструменты для обмена рабочими фрагментами C#: dotnetfiddle.net и csharpad.com. 12.08.2014

Ответы:


1

Как указано в документации MSDN для XElement.Value говорит:

Получает или задает объединенное текстовое содержимое этого элемента.

Таким образом, XElement.Value действительно будет возвращать только текстовые узлы и будет (в случае смешанного содержимого) игнорировать нетекстовые узлы (но не текстовые узлы, содержащиеся в них).

Вы ищете внутренний XML XElement, который можно получить с помощью XmlReader.

// this writes only the (concatenated) text nodes
Console.WriteLine(xe.First().Value);

// this writes the inner XML, including elements
var reader = xe.First().CreateReader();
reader.MoveToContent();
Console.WriteLine(reader.ReadInnerXml());

Если вы предпочитаете оставаться в LINQ, вы можете просто присоединиться к строковому представлению всех дочерних узлов:

Console.WriteLine(
  xe.First().Nodes().Aggregate("", (result, node) => result += node.ToString())
);

Or

string.Join("", xe.First().Nodes().Select(n => n.ToString())).Dump();

Но, как говорится в связанном вопросе: это намного медленнее, чем использование читателя.

12.08.2014
  • Спасибо за помощь, Фрэнк, пока я использую ваш первый однострочник LINQ. Если это окажется хитом времени, я вместо этого исследую читателя. 12.08.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..