Способ (ы) извлечения значений выбранного узла из этой разметки XML

2

Учитывая, что (образец - реальная разметка может быть значительно сложнее), разметка и ограничения, перечисленные ниже, могут предложить решение (С#) более эффективно/эффективно, чем ходить по всему дереву для извлечения { "@@value1 @@" "@@value2 @@", "@@value3 @@" }, то есть список токенов, которые будут заменены, когда действительно используется разметка.

Примечание. У меня нет контроля над разметкой, структурой разметки или форматированием/наименованием токенов, которые заменяются.

<markup>
    <element1 attributea="blah">@@value1@@</element1>
    <element2>@@value2@@</element2>
    <element3>
        <element3point1>@@value1@@</element3point1>
        <element3point2>@@value3@@</element3point2>
        <element3point3>apple</element3point3>
    <element3>
    <element4>pear</element4>
</markup>
  • 0
    Он начинается сериализовано как текст или уже проанализирован? Простой поиск по регулярному выражению, если он уже сериализован.
  • 0
    Вы просто хотите получить токены или заменить их?
Показать ещё 1 комментарий
Теги:
token
traversal

2 ответа

2
Лучший ответ

Как насчет:

    var keys = new HashSet<string>();
    Regex.Replace(input, "@@[^@]+@@", match => {
        keys.Add(match.Value);
        return ""; // doesn't matter
    });
    foreach (string key in keys) {
        Console.WriteLine(key);
    }

Это:

  • не беспокоит синтаксический анализ xml (просто манипуляции с строкой)
  • включает только уникальные значения (нет необходимости возвращать MatchCollection с дублирующими элементами, которые мы не хотим)

Однако он может создать большую строку, поэтому, возможно, просто Matches:

var matches = Regex.Matches(input, "@@[^@]+@@");
var result = matches.Cast<Match>().Select(m => m.Value).Distinct();
foreach (string s in result) {
    Console.WriteLine(s);
}
  • 0
    Работал угощение (второй фрагмент), спасибо! знак равно
0

Я написал быстрый прог с вашим образцом, это должно сделать трюк.

class Program
    {
        //I just copied your stuff to Test.xml
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load("Test.xml");
            var verbs=new Dictionary<string,string>();
            //Add the values to replace ehre
            verbs.Add("@@value3@@", "mango");
            verbs.Add("@@value1@@", "potato");
            ReplaceStuff(verbs, doc.Root.Elements());
            doc.Save("Test2.xml");
        }

        //A simple replace class
        static void ReplaceStuff(Dictionary<string,string> verbs,IEnumerable<XElement> elements)
        {
            foreach (var e in elements)
            {
                if (e.Elements().Count() > 0)
                    ReplaceStuff(verbs, e.Elements() );
                else
                {
                    if (verbs.ContainsKey(e.Value.Trim()))
                        e.Value = verbs[e.Value];
                }
            }
        }
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню