Сортировка узлов XML на основе DateTime приписывает C#, XPath

18 января 2019 г. в 13:43 На данный момент вам нужны два индекса, чтобы покрыть основное правило ОБА левому и правому объектам JOIN = нужен индекс. 1. ALTER TABLE tbl_workermap ДОБАВИТЬ ИНДЕКС idx_t_w_map_job_id (job_id) 2. ALTER TABLE tbl_workermap ДОБАВИТЬ ИНДЕКС idx_t_w_map_wrk_user_id (worker_user_id) после создания, запустить EXPLAIN ..... для просмотра нового плана выполнения.

7
задан discorax 5 December 2008 в 21:26
поделиться

5 ответов

Существует перегрузка XPathExpression. Addsort, который берет интерфейс IComparer. При реализации сравнения сами как IComparer Вы могли бы использовать этот механизм.

 class Program
        {
            static void Main(string[] args)
            {
                XPathDocument saleResults = new XPathDocument( @"salesData.xml" );
                XPathNavigator navigator = saleResults.CreateNavigator( );
                XPathExpression selectExpression = navigator.Compile( "sales/item" );
                XPathExpression sortExpr = navigator.Compile("@sTime");
                selectExpression.AddSort(sortExpr, new DateTimeComparer());
                XPathNodeIterator nodeIterator = navigator.Select( selectExpression );            
                while ( nodeIterator.MoveNext( ) )
                {
                    string checkMe = nodeIterator.Current.Value;
                }
            }
            public class DateTimeComparer : IComparer
            {
                public int Compare(object x, object y)
                {
                    DateTime dt1 = DateTime.Parse( x.ToString( ) );
                    DateTime dt2 = DateTime.Parse( y.ToString( ) );
                    return dt1.CompareTo( dt2 );
                }
            }
        }
4
ответ дан 6 December 2019 в 21:21
поделиться

Вот:

XmlDocument myDoc = new XmlDocument();

myDoc.LoadXml(@"
<sales>
<item name=""Games""
    sku=""MIC28306200""
    iCat=""28""
    sTime=""11/26/2008 8:41:12 AM""
    price=""1.00""
    desc=""Item Name"" />
<item name=""Games""
    sku=""MIC28307100""
    iCat=""28""
    sTime=""11/26/2008 8:42:12 AM""
    price=""1.00""
    desc=""Item Name"" />
</sales>
");

var sortedItems = myDoc.GetElementsByTagName("item").OfType<XmlElement>()
    .OrderBy(item => DateTime.ParseExact(item.GetAttribute("sTime"), "MM/dd/yyyy h:mm:ss tt", null));

foreach (var item in sortedItems)
{
    Console.WriteLine(item.OuterXml);
}

Это - Консольное приложение, которое работает отлично.

5
ответ дан 6 December 2019 в 21:21
поделиться

Вот решение XSLT:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="sales">
      <sales>
        <xsl:for-each select="item">
          <xsl:sort select="substring(@sTime,7,4)" data-type="number"/>
          <xsl:sort select="substring(@sTime,1,2)" data-type="number"/>
          <xsl:sort select="substring(@sTime,4,2)" data-type="number"/>
          <xsl:sort select="substring-after(substring-after(@sTime,' '),' ')" />
          <xsl:sort data-type="number" select=
           "translate(
               substring-before(substring-after(@sTime,' '),' '),
               ':', ''
                      )
               " />
          <xsl:copy-of select="."/>
        </xsl:for-each>
      </sales>
    </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется на следующий XML-документ:

<sales>
    <item name="Games" sku="MIC28306200" iCat="28"
          sTime="11/26/2008 8:41:12 PM"
          price="1.00" desc="Item Name" />
    <item name="Games" sku="MIC28307100" iCat="28"
          sTime="11/26/2008 8:42:12 AM"
                price="1.00" desc="Item Name" />
    <item name="Games" sku="MIC28307100" iCat="28"
          sTime="11/26/2008 11:42:12 AM"
                price="1.00" desc="Item Name" />
    <item name="Games" sku="MIC28306200" iCat="28"
          sTime="12/23/2008 8:41:12 PM"
          price="1.00" desc="Item Name" />
    <item name="Games" sku="MIC28307100" iCat="28"
          sTime="12/23/2008 8:42:12 AM"
                price="1.00" desc="Item Name" />
</sales>

к корректному результату приводят:

<sales>
   <item name="Games" sku="MIC28307100" iCat="28" sTime="11/26/2008 8:42:12 AM" price="1.00" desc="Item Name"/>
   <item name="Games" sku="MIC28307100" iCat="28" sTime="11/26/2008 11:42:12 AM" price="1.00" desc="Item Name"/>
   <item name="Games" sku="MIC28306200" iCat="28" sTime="11/26/2008 8:41:12 PM" price="1.00" desc="Item Name"/>
   <item name="Games" sku="MIC28307100" iCat="28" sTime="12/23/2008 8:42:12 AM" price="1.00" desc="Item Name"/>
   <item name="Games" sku="MIC28306200" iCat="28" sTime="12/23/2008 8:41:12 PM" price="1.00" desc="Item Name"/>
</sales>
2
ответ дан 6 December 2019 в 21:21
поделиться

То, что Вы пытаетесь сделать, выполняется намного более легко, если XML правильно создается. В рекомендации XML-схемы говорится, что дата/временные стоимости должна быть представлена в формате ISO8601, т.е. CCCC-MM-DD HH:MM:SS. (На самом деле XML-схема хочет, чтобы разделитель между датой и временем был T, и в данный момент я не помню почему.)

Два основных преимущества форматирования дат и времени этот путь:

  • Это - то, что другие пользователи XML ожидают, и
  • Можно отсортировать на их строковых значениях.

Это - жестокость по отношению к датам формата любой другой путь в XML, это будет обработанным XSLT.

Достаточно легко заставить.NET испустить значения DateTime в этом формате (используйте "s" спецификатор формата, который обозначает - ожидают его - "поддающийся сортировке").

1
ответ дан 6 December 2019 в 21:21
поделиться

предположим, что ваша дата и время в этом формате

2010-06-01T15: 16: 29 + 05: 00

, тогда самый простой способ сделать это

В DATETIME ПРОСТО ЗАМЕНИТЕ ДОПОЛНИТЕЛЬНЫЕ СИМВОЛЫ в моем формате даты и времени у меня есть дополнительные символы (- T: и +), поэтому просто замените их И ТОГДА ВАША ДАТА ВРЕМЯ БУДЕТ В НОМЕРАХ, КОТОРЫЕ МОЖНО ЛЕГКО СОРТИРОВАТЬ

0
ответ дан 6 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: