Вставить в строку после n-го появления токена - PullRequest
0 голосов
/ 22 ноября 2011

У меня есть следующий HTML в строковой переменной myHtml. Переменная myHTML заполняется HTML из некоторой функции, которая возвращает HTML следующим образом

string myHtml="<table> <tr id='12345'><td>Hello1</td></tr> <tr id='12346'><td>Hello2</td></tr> </table>";

В этом примере есть двастрок в моих возвращенных данных, и мне нужно добавить еще одну строку между строками выше с id=1234678.Тогда myHtml может выглядеть как

myHtml="<table> <tr id='12345'><td>Hello1</td></tr> <tr id='1234678'><td>Hello New</td></tr>  <tr id='12346'><td>Hello2</td></tr> </table>";

Я хочу сделать это, добавив HTML с помощью строковых операций, таких как indexOf и т. Д., Но я не могу понять, как это сделать.

Ответы [ 4 ]

5 голосов
/ 22 ноября 2011

Не используйте строки для этого, но библиотека для этого.Например, HTML-пакет agility

1 голос
/ 22 ноября 2011

Попробуйте использовать Linq to XML. Создайте XDocument на основе вашей строки. Затем найдите свой узел tr и вставьте новый узел tr.

var newTR = new XElement("tr", new XAttribute("id", "1234678"), new XElement("td", "Hello3"));
TextReader tr = new StringReader(myHtml);
XDocument doc = XDocument.Load(tr);
doc.Decendants().Skip(1).AddAfterSelf(newTR);
var newStr = doc.ToString();
1 голос
/ 22 ноября 2011

Попробуйте это

    myHtml = "<table> <tr id='12345'><td>Hello1</td></tr> <tr id='12346'><td>Hello2</td></tr> </table>";
    int index1 = myHtml.IndexOf("<tr", 0);
    int index2 = myHtml.IndexOf("<tr", index1 + 3); // 3 for amount of characters in '<tr'
    myHtml = myHtml.Insert(index2, "<tr id='1234678'><td>Hello</td></tr>");

Вы также можете построить массив с помощью цикла, чтобы вы могли вставлять строки в любое место, если существует более двух существующих строк.

1 голос
/ 22 ноября 2011

Всегда ли есть только 2 строки?Если это так, это будет работать:

string newRow = " <tr id='1234678'><td>Hello New</td></tr> ";
int i = myHtml.IndexOf("</tr>") + 5;            
string newHtml = myHtml.Insert(i, newRow);

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

например:

    int IndexOfNth(string source, string token, int nTh)
    {
        int index = source.IndexOf(token);

        if (index != -1)
        {
            int i = 1;
            while (i++ < nTh)
                index = source.IndexOf(token, index + 1);
        }

        return index;
    }

Тогда вы будете использовать:

int i = IndexOfNth(myHtml, "</tr>", 1) + 5; // find first "</tr>" and insert after

// Or you could use
int i = IndexOfNth(myHtml, "<tr ", 2); // find second "<tr " and insert before
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...