在第n次出现记号后插入字符串

本文关键字:插入 字符串 记号 在第 | 更新日期: 2023-09-27 18:15:21

我在字符串变量myHtml中有以下HTML。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>";

我想通过在字符串操作(如indexOf等)的帮助下附加HTML来做到这一点,但我不知道如何做到这一点

在第n次出现记号后插入字符串

不要使用字符串,而是使用库。例如HTML敏捷性包

总是只有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

试试这个

    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>");

你也可以通过循环构建一个数组,这样你就可以在你喜欢的任何地方插入行,如果有两个以上的现有行

尝试使用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();