VB Копирование значений из XML в строки с использованием XMLDocument [дубликат]

Я сделал некоторые изменения, чтобы исправить конечный индекс, когда индекс начала превышает длину списка. Я также добавляю перевод для первой и последней страницы. Он предназначен для @ углового / материала 5.2.4 компонента разбиения на страницы.

import { Injectable } from '@angular/core';
import { MatPaginatorIntl } from '@angular/material';
import { TranslateService } from '@ngx-translate/core';

@Injectable()
export class MatPaginationIntlService extends MatPaginatorIntl {
  translate: TranslateService;
  firstPageLabel = 'First page';
  itemsPerPageLabel = 'Items per page';
  lastPageLabel = 'Last page';
  nextPageLabel = 'Next page';
  previousPageLabel = 'Previous page';

  getRangeLabel = (page: number, pageSize: number, length: number): string => {
    const of = this.translate ? this.translate.instant('mat-paginator-intl.of') : 'of';
    if (length === 0 || pageSize === 0) {
      return '0 ' + of + ' ' + length;
    }
    length = Math.max(length, 0);
    const startIndex = ((page * pageSize) > length) ?
      (Math.ceil(length / pageSize) - 1) * pageSize:
      page * pageSize;

    const endIndex = Math.min(startIndex + pageSize, length);
    return startIndex + 1 + ' - ' + endIndex + ' ' + of + ' ' + length;
  };

  injectTranslateService(translate: TranslateService) {
    this.translate = translate;

    this.translate.onLangChange.subscribe(() => {
      this.translateLabels();
    });

    this.translateLabels();
  }

  translateLabels() {
    this.firstPageLabel = this.translate.instant('mat-paginator-intl.first_page');
    this.itemsPerPageLabel = this.translate.instant('mat-paginator-intl.items_per_page');
    this.lastPageLabel = this.translate.instant('mat-paginator-intl.last_page');
    this.nextPageLabel = this.translate.instant('mat-paginator-intl.next_page');
    this.previousPageLabel = this.translate.instant('mat-paginator-intl.previous_page');
  }
}
3
задан Andrew 5 July 2012 в 17:39
поделиться

3 ответа

Проблема в том, что элемент sitemapindex определяет пространство имен по умолчанию. Вам нужно указать пространство имен, когда вы выбираете узлы, иначе они их не найдут. Например:

XmlDocument xml = new XmlDocument();
xml.Load("sitemap.xml");
XmlNamespaceManager manager = new XmlNamespaceManager(xml.NameTable);
manager.AddNamespace("s", "http://www.sitemaps.org/schemas/sitemap/0.9");
XmlNodeList xnList = xml.SelectNodes("/s:sitemapindex/s:sitemap", manager);

Обычно, используя XmlNameSpaceManager, вы можете оставить префикс пустой строкой, чтобы указать, что это пространство имен является пространством имен по умолчанию. Поэтому вы могли бы подумать, что сможете сделать что-то вроде этого:

// WON'T WORK
XmlDocument xml = new XmlDocument();
xml.Load("sitemap.xml");
XmlNamespaceManager manager = new XmlNamespaceManager(xml.NameTable);
manager.AddNamespace("", "http://www.sitemaps.org/schemas/sitemap/0.9"); //Empty prefix
XmlNodeList xnList = xml.SelectNodes("/sitemapindex/sitemap", manager); //No prefixes in XPath

Однако, если вы попробуете этот код, вы обнаружите, что он не найдет подходящих узлов. Причина этого заключается в том, что в XPath 1.0 (что и реализуется XmlDocument), когда пространство имен не предоставляется, оно всегда использует пустое пространство имен, а не пространство имен по умолчанию. Таким образом, не имеет значения, укажите ли вы пространство имен по умолчанию в XmlNamespaceManager, оно не будет использоваться XPath. Чтобы процитировать соответствующий абзац из Официальной спецификации XPath :

QName в тесте узла расширяется в расширенное имя, используя объявления пространства имен из контекста выражения. Точно так же выполняется расширение для имен типов элементов в начальных и конечных тегах, за исключением того, что пространство имен по умолчанию, объявленное с помощью xmlns, не используется: если QName не имеет префикса, тогда URI пространства имен имеет значение NULL (это то же самое имена атрибутов пути). Это ошибка, если в QName есть префикс, для которого нет объявления пространства имен в контексте выражения.

Поэтому, когда элементы, которые вы читаете, принадлежат пространству имен, вы не можете избегайте помещать префикс пространства имен в ваши инструкции XPath. Однако, если вы не хотите помещать URI пространства имен в свой код, вы можете просто использовать объект XmlDocument для возврата URI корневого элемента, который в этом случае является тем, что вы хотите. Например:

XmlDocument xml = new XmlDocument();
xml.Load("sitemap.xml");
XmlNamespaceManager manager = new XmlNamespaceManager(xml.NameTable);
manager.AddNamespace("s", xml.DocumentElement.NamespaceURI); //Using xml's properties instead of hard-coded URI
XmlNodeList xnList = xml.SelectNodes("/s:sitemapindex/s:sitemap", manager);
11
ответ дан Steven Doggart 27 August 2018 в 20:19
поделиться

Я бы определенно использовал LINQ для XML вместо старого XML-интерфейса, основанного на XmlDocument. Вы можете выполнить то, что хотите, используя следующий код. Обратите внимание: я изменил имя элемента, который пытается получить значение «loc» и «lastmod», потому что это то, что находится в вашем примере XML («name» и «url» не существует):

XElement element = XElement.Parse(XMLFILE);
        IEnumerable<XElement> list = element.Elements("sitemap");
        foreach (XElement e in list)
        {
            String LOC= e.Element("loc").Value;
            String LASTMOD = e.Element("lastmod").Value;
        }
-1
ответ дан Chris Knight 27 August 2018 в 20:19
поделиться

Карта сайта имеет 2 поднабора «loc» и «lastmod». Узлами, к которым вы обращаетесь, являются «имя» и «URL». поэтому вы не получаете никакого результата. Кроме того, в вашем XML-файле последний тег sitemap не закрывается должным образом с помощью соответствующего метода «Добровольно попробуйте xn [" loc "]. InnerText и посмотрите, получите ли вы желаемый результат.

0
ответ дан user1071979 27 August 2018 в 20:19
поделиться
Другие вопросы по тегам:

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