Можно ли использовать подстановочные знаки с тегами Xinclude?
Вопрос
Боюсь, это невозможно, но нигде не нашел, что это невозможно.
Я хотел бы включить набор файлов в документ XML с использованием подстановочных знаков. Как это:
<?xml version="1.0" encoding="utf-8"?>
<mydocument>
<!-- ... -->
<xi:include href="*include.xml"/>
</mydocument>
Я знаю, что это не работает, но я думаю, что это ясно выражает мои намерения. Есть ли способ достичь этого?
Редактировать:
Я пытался использовать xpointer
Атрибут, но не мог заставить это работать.
Решение
Можно ли использовать подстановочные знаки с тегами Xinclude?
Нет href
обозначает URI, и у них нет концепции подстановочных знаков.
В противном случае можно было бы отразить домашнюю страницу Google, сказав что -то вроде href="http://www.google.com/*"
.
Подсказка: файловые системы также не имеют никакой концепции подстановки. Раковины делать. Они делают тяжелую работу заполнения заготовки для вас, когда они проанализируют путь и видят *
. Анкет Основная файловая система никогда не видит звездочку.
Другие советы
Есть быстрый вариант
Переопределить XmlResolver, чтобы создать резолвер с подстановочным знаком:
class WildCardResolver : XmlUrlResolver
{
public override Uri ResolveUri(Uri baseUri, string relativeUri)
{
try
{
DirectoryInfo di = new DirectoryInfo(baseUri.AbsolutePath); // TODO Check it is valid.
string combinedFilePath = Path.GetTempFileName();
using (FileStream combinedStream = new FileStream(combinedFilePath, FileMode.OpenOrCreate))
{
foreach (FileInfo fi in di.GetFiles(relativeUri))
{
using (FileStream fileStream = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read))
{
fileStream.CopyTo(combinedStream);
}
}
}
Uri absUri = new Uri(combinedFilePath);
return absUri;
}
catch(Exception ex)
{
//Log Exception
return base.ResolveUri(baseUri, relativeUri);
}
}
}
Есть много дел, чтобы заметить, применимы ли подстановочные знаки вообще
Кроме того, Baseuri может быть сложным, потому что, скажем, источник XML из
file: // c: /myxmlrepository/myxml.xml
Включает *Inc.xml
Теперь базовый URI - это файл // c: /temp/tmpa0.tmp
.
.
Желаю вам удачи,
РЕДАКТИРОВАТЬ:
Есть еще один способ переопределить
public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
Но есть и другая проблема, возникающая ... потому что абсолютный URI не всегда будет действительным, и XincludingReader пытается проверить его.
@Tomalek абсолютно здесь. Есть способы сделать то, что вы пытаетесь сделать, но Xinclude не является правильным ответом. Вам понадобится какой -то инструмент, который может справиться с расширением подстановочных знаков для вас.
Вы можете почти наверняка сделать это с чем -то вроде Норма Уолша Реализация XPROC - Calabash Но вам нужно каким -то образом бросить свой собственный эквивалент Xinclude.