Generating an attribute value of an xml file by counting a specific line using LINQ 2 XML?

I have some XML files that can contain nodes <disp-formula id="deqn*">, and each of these nodes has a line in it with a name \tag. Now the number of keywords \tagcan be one or more in each node <disp-formula id="deqn*">.

I want to generate an attribute value idstarting at 1, and then increment to +1 for each found <disp-formula id="deqn*">using \tagcount.

Sample data:

<disp-formula id="deqn*">...\tag...</disp-formula>
<disp-formula id="deqn*">...\tag...\tag...\tag ...</disp-formula>
<disp-formula id="deqn*">...\tag ...</disp-formula>
<disp-formula id="deqn*">...\tag...\tag ...</disp-formula>

Expected Modification:

<disp-formula id="deqn1">...\tag...</disp-formula>
<disp-formula id="deqn2-4">...\tag...\tag...\tag ...</disp-formula>
<disp-formula id="deqn5">...\tag ...</disp-formula>
<disp-formula id="deqn6-7">...\tag...\tag ...</disp-formula>

To generate numbers for a specific line, I mainly use the following process:

string inputText = File.ReadAllText(@"C:\temp\sample.xml");
string findText = @"*";  

int matchCount = inputText.Split(findText.ToCharArray()).Length - 1;  

if (matchCount > 0)  
{  
    for (int counter = 1; counter <= matchCount; counter++)  
    {  
        var regex = new Regex(Regex.Escape(findText));  
        inputText = regex.Replace(inputText, counter.ToString(), 1);  
    }  
}

, \tag LINQ2XML ? - ?

+4
2

:

XDocument doc = XDocument.Load("disp.xml");
var deqns = doc.Descendants("disp-formula");
int countIndex = 1;
foreach (var deqn in deqns)
{
    var matchCount = deqn.Value.Select((c, i) => deqn.Value.Substring(i)).Count(sub => sub.StartsWith("\\tag"));
    if (matchCount > 0)
    {
        int lastMatchCount = countIndex + matchCount - 1;
        var attribute = string.Format("deqn-{0}", countIndex);
        if (lastMatchCount > countIndex)
        {
            attribute = attribute + "-" + lastMatchCount;
        }
        deqn.Attribute("id").Value = attribute;
        countIndex = lastMatchCount + 1;
    }
}
doc.Save("disptarget.xml");
+3
static void Main(string[] args)
{
    var xmlStr =
        @"<root>
            <disp-formula id='deqn*'>...\tag...</disp-formula>
            <disp-formula id='deqn*'>...\tag...\tag...\tag ...</disp-formula>
            <disp-formula id='deqn*'>...\tag ...</disp-formula>
            <disp-formula id='deqn*'>...\tag...\tag ...</disp-formula>
        </root>";

    var xml = XElement.Parse(xmlStr);

    int x = 0;
    xml.Elements().ToList().ForEach(node =>
    {
        var count = Regex.Matches(node.Value, @"\\tag").Count;
        if (count > 0)
        {
            string start = (x + 1).ToString();
            string end = (x += count).ToString();
            string period = end == start ? start : $"{start}-{end}";
            node.Attribute("id").Value = "deqn" + period;
        }
    });

    Console.WriteLine(xml);
}
0

Source: https://habr.com/ru/post/1691304/


All Articles