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

StackOverflow https://stackoverflow.com/questions/4488704

  •  11-10-2019
  •  | 
  •  

Вопрос

Боюсь, это невозможно, но нигде не нашел, что это невозможно.

Я хотел бы включить набор файлов в документ 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top