Можно ли использовать подстановочные знаки с тегами XInclude? - PullRequest
1 голос
/ 20 декабря 2010

Боюсь, что это невозможно, но нигде не найдено, что, как говорят, невозможно.

Я хотел бы включить набор файлов в документ XML с использованием подстановочных знаков. Как это:

<?xml version="1.0" encoding="utf-8"?>
<mydocument>
  <!-- ... -->
  <xi:include href="*include.xml"/>
</mydocument>

Я знаю, что это не работает, но я думаю, что это ясно выражает мои намерения. Есть ли способ добиться этого?

Edit:

Я пытался использовать атрибут xpointer, но не смог заставить его работать.

Ответы [ 3 ]

3 голосов
/ 20 декабря 2010

Можно ли использовать подстановочные знаки с тегами XInclude?

Нет. href обозначает URI, и у них нет понятия подстановочных знаков.

В противном случае можно отобразить домашнюю страницу Google, сказав что-то вроде href="http://www.google.com/*".

Подсказка: Файловые системы также не имеют подстановочных знаков. Снаряды до. Они выполняют тяжелую работу по заполнению заготовок для вас, когда они разбирают путь и видят *. Базовая файловая система никогда не увидит звездочку.

1 голос
/ 22 марта 2012

Есть быстрый вариант

Переопределите 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-код взят из

файл: // с: /myXMLRepository/myXML.xml

включает * inc.xml

теперь базовый URI - это файл // c: /temp/tmpA0.tmp

.

.

желаю вам удачи,

EDIT:

Есть еще один способ переопределить

public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)

но есть и другая проблема, навязанная этим ... потому что Абсолютный URI не всегда будет действительным, и XInclusionReader попытается его проверить.

0 голосов
/ 22 декабря 2010

@ Томалек абсолютно прав. Есть способы сделать то, что вы пытаетесь сделать, но XInclude не правильный ответ. Вам понадобится какой-то инструмент, который сможет справиться с расширением по шаблону.

Вы почти наверняка можете сделать это с помощью чего-то вроде реализации XProc Норма Уолша - calabash , но вам нужно каким-то образом свернуть свой собственный эквивалент XInclude.

...