как включить внешний XML в файл XML - как должны выглядеть оба файла - PullRequest
1 голос
/ 19 сентября 2011

Я использую .NET C # XML и LINQ для обновления / удаления / вставки моего XML-файла.

У меня есть XML-файл, как показано ниже (image1), и я хотел бы включить только 2-й XML-файл.

Первый файл XML - это оригинальный файл, и я не хочу трогать этот файл. Поэтому я предпочитаю ссылку на 2-й. файл (внешний файл), чтобы я мог добавлять / удалять строки XML вместо XML-файла Mainf.

Но как включить или объединить 2-й XML-файл (внешний файл) в ПЕРВЫЙ? Мне просто нужно, чтобы теги (см. КРАСНУЮ рамку) были видны в КРАСНОЙ рамке.

<RewriterRule>
   <LookFor>        </LookFor>
   <SendTo>         </SendTo>
</RewriterRule>

Вопрос:

1- Что мне нужно написать для кода в XML-файле 1, чтобы мой код в XML-файле 2 (внешний файл) был включен?

2- Как должен выглядеть мой XMLfile 2 (внешний файл)? На самом деле мне нужны теги, которые я думаю, потому что я читаю XML XDocument xdoc = XDocument.Load(this.Server.MapPath(path)); и выполняю некоторые обновления / удаления .....

Original file

IMAG2 - ВНЕШНИЙ ФАЙЛ enter image description here

Ответы [ 2 ]

4 голосов
/ 19 сентября 2011

Хорошо добавить элементы из второго файла очень просто:

XDocument doc1 = XDocument.Load(MapPath("file1.xml"));
doc1.Root.Element("Rules").Add(XDocument.Load(MapPath("file2.xml")).Root.Element("Rules").Elements("RewriterRule"));

// now save to third file with e.g.
doc1.Save(MapPath("updated.xml"));
// or overwrite first file e.g.
doc1.Save(MapPath("file1.xml"));

С другой стороны, термин «объединение» предполагает, что вы можете захотеть сделать что-то более сложное, например, определить элементы на основе некоторого идентификатора или ключа, а затем не просто добавить новые элементы, а перезаписать некоторые данные. Вам нужно будет предоставить более подробную информацию о том, какой именно процесс слияния вы хотите, если вам нужна помощь в написании кода.

[править] Вот пример того, как использовать основанный на DTD механизм ссылки на внешнюю сущность для включения файла фрагмента XML в другой документ: file1.xml выглядит следующим образом:

<!DOCTYPE example [
  <!ENTITY e1 SYSTEM "fragment.xml">
]>
<example>
  <data>
    <item>1</item>
    &e1;
  </data>
</example>

фрагмент.xml выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<item>2</item>

Затем при чтении основного файла с помощью LINQ to XML и .NET 4.0 необходимо убедиться, что используемый вами XmlReader настроен для анализа DTD, например,

        XDocument doc;
        using (XmlReader xr = XmlReader.Create("file1.xml", new XmlReaderSettings() { DtdProcessing = System.Xml.DtdProcessing.Parse }))
        {
            doc = XDocument.Load(xr);
        }
1 голос
/ 09 декабря 2013

Существует лучший подход с тегом XInclude W3C.Вот мой метод расширения Linq to XML:

/// <summary>
/// Linq to XML XInclude extentions
/// </summary>
public static class XIncludeExtention
{
    #region fields

    /// <summary>
    /// W3C XInclude standard
    /// Be aware of the different 2001 and 2003 standard.
    /// </summary>
    public static readonly XNamespace IncludeNamespace = "http://www.w3.org/2003/XInclude";

    /// <summary>
    /// Include element name
    /// </summary>
    public static readonly XName IncludeElementName = IncludeNamespace + "include";

    /// <summary>
    /// Include location attribute
    /// </summary>
    public const string IncludeLocationAttributeName = "href";

    /// <summary>
    /// Defines the maximum sub include count of 25
    /// </summary>
    public const int MaxSubIncludeCountDefault = 25;

    #endregion


    #region methods


    /// <summary>
    /// Replaces XInclude references with the target content.
    /// W3C Standard: http://www.w3.org/2003/XInclude
    /// </summary>
    /// <param name="xDoc">The xml doc.</param>
    /// <param name="maxSubIncludeCount">The max. allowed nested xml includes (default: 25).</param>
    public static void ReplaceXIncludes(this XDocument xDoc, int maxSubIncludeCount = MaxSubIncludeCountDefault)
    {
        ReplaceXIncludes(xDoc.Root, maxSubIncludeCount);
    }

    /// <summary>
    /// Replaces XInclude references with the target content.
    /// W3C Standard: http://www.w3.org/2003/XInclude
    /// </summary>
    /// <param name="xmlElement">The XML element.</param>
    /// <param name="maxSubIncludeCount">The max. allowed nested xml includes (default: 25).</param>
    public static void ReplaceXIncludes(this XElement xmlElement, int maxSubIncludeCount = MaxSubIncludeCountDefault)
    {
        xmlElement.ReplaceXIncludes(1, maxSubIncludeCount);
    }

    private static void ReplaceXIncludes(this XElement xmlElement, int subIncludeCount, int maxSubIncludeCount)
    {
        var results = xmlElement.DescendantsAndSelf(IncludeElementName).ToArray<XElement>();    // must be materialized

        foreach (var includeElement in results)
        {
            var path = includeElement.Attribute(IncludeLocationAttributeName).Value;
            path = Path.GetFullPath(path);

            var doc = XDocument.Load(path);
            if (subIncludeCount <= maxSubIncludeCount)  // protect mutal endless references
            {
                // replace nested includes
                doc.Root.ReplaceXIncludes(++subIncludeCount, maxSubIncludeCount);
            }
            includeElement.ReplaceWith(doc.Root);
        }
    }

    #endregion
}

Код был вдохновлен следующим сообщением в блоге: http://catarsa.com/Articles/Blog/Any/Any/Linq-To-Xml-XInclude?MP=pv

Дополнительная информация XInclude: http://msdn.microsoft.com/en-us/library/aa302291.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...