Отфильтровывание пустых тегов в XML с помощью C#

#c# #xml #tags

#c# #xml #Теги

Вопрос:

Итак, я использую этот код для синтаксического анализа гигантского (80 000 строк) XML-документа. Однако, когда он был передан мне, он добавил ненужные строки из-за родительских узлов (что было исправлено оператором if в коде), и теперь он удваивается на пустых узлах.

Всякий раз, когда я нажимаю на пустой узел, он удваивается на узле перед ним … например, вот фрагмент xml:

 <edit>
    <who>Jim Johnson(Jim.m.Johnson@google.com)</who>
    <when>2010-08-18T12:14:33.613Z</when>
    <description></description>
</edit>
  

И поток данных, который я получаю, в конечном итоге выглядит как:

 who                Jim Johnson
when               8/18/2010
description        8/18/2010
  

У кого-нибудь есть хорошая идея относительно того, как обрезать эти пустые теги?
Вот фрагмент кода, который генерирует эту таблицу.

 using (XmlReader reader = XmlReader.Create(new StringReader(
{
    // Parse the file and display each of the nodes.
    while (reader.Read())
    {
        switch (reader.NodeType)
        {
            case XmlNodeType.Element:
                elementName = reader.Name;
                switch (elementName)
                {
                    //display my title stuff
                }
                break;
            case XmlNodeType.Text:
                elementText = reader.Value;
                break;
            case XmlNodeType.XmlDeclaration:
            case XmlNodeType.ProcessingInstruction:
                break;
            case XmlNodeType.Comment:
                break;
            case XmlNodeType.EndElement:
                if (elementName == reader.Name)
                {
                    contractRowArray1[0] = elementName;
                    contractRowArray1[1] = elementText;
                    contractRow = contractTable.NewRow();
                    contractRow.ItemArray = contractRowArray1;
                    contractTable.Rows.Add(contractRow);
                }
                break;
        }
    }
}
  

Ответ №1:

Работает ли это?

 case XmlNodeType.Element:
    elementName = reader.Name;
    elementText = null;                  // ADDED
    switch (elementName)
    {
        //display my title stuff
    }
    break;
  

 case XmlNodeType.EndElement:
    if (elementName == reader.Name amp;amp; elementText != null)       // MODIFIED
    {
        contractRowArray1[0] = elementName;
        contractRowArray1[1] = elementText;
        contractRow = contractTable.NewRow();
        contractRow.ItemArray = contractRowArray1;
        contractTable.Rows.Add(contractRow);
    }
    break;
  

Комментарии:

1. Я уже пробовал это, для пустых тегов elementText равен предыдущему тексту, поэтому он никогда не становится нулевым. В программе elementText упоминается только 3 раза, 2 раза в опубликованном мной сегменте кода, и единственный другой раз — инициализация. На самом деле у меня не было верхней части, когда я устанавливал проверку null, давайте посмотрим, работает ли это добавление без удаления всей информации.

2. Кажется, сработало, я все еще в замешательстве, как после установки значения null и никогда больше не изменять значение, оно не уничтожило все данные …. но я полагаю, что это работает! Спасибо! 😀

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

4. Теперь, после некоторых исследований, я понимаю, что reader читает только часть строки, я предполагал, что при каждом запуске while (reader.read()) читает целую строку, например <csm> бла </csm> но теперь я понимаю, что он читает <csm> запускает ее, затем бла, затем </ csm> Кажется странным. В любом случае, еще раз спасибо!

5. Последний вопрос, если бы вы могли ответить на этот, внутри моего XML есть объекты данных, подобные этому: <who xsi:nil=»true» /> Что это за XmlNodeType? Кажется, он работает как элемент, и я не могу понять, как отличить этот тип элемента от элементов только типа <who>.