Я сделал некоторые изменения, чтобы исправить конечный индекс, когда индекс начала превышает длину списка. Я также добавляю перевод для первой и последней страницы. Он предназначен для @ углового / материала 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');
}
}
Проблема в том, что элемент 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 есть префикс, для которого нет объявления пространства имен в контексте выражения.
blockquote>Поэтому, когда элементы, которые вы читаете, принадлежат пространству имен, вы не можете избегайте помещать префикс пространства имен в ваши инструкции 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);
Я бы определенно использовал 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;
}
Карта сайта имеет 2 поднабора «loc» и «lastmod». Узлами, к которым вы обращаетесь, являются «имя» и «URL». поэтому вы не получаете никакого результата. Кроме того, в вашем XML-файле последний тег sitemap не закрывается должным образом с помощью соответствующего метода «Добровольно попробуйте xn [" loc "]. InnerText и посмотрите, получите ли вы желаемый результат.