Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过使用LINQ 2 xml计算特定字符串来生成文件的xml属性值?_C#_Xml - Fatal编程技术网

C# 通过使用LINQ 2 xml计算特定字符串来生成文件的xml属性值?

C# 通过使用LINQ 2 xml计算特定字符串来生成文件的xml属性值?,c#,xml,C#,Xml,我有一些XML文件,其中可能包含节点,其中每个节点都有一个名为\tag的字符串。现在,关键字\tag的数量可以是每个节点中的一个或多个 我想从1开始生成属性值id,然后使用\tag计数找到的每个都增加到+1 样本数据: <disp-formula id="deqn*">...\tag...</disp-formula> <disp-formula id="deqn*">...\tag...\tag...\tag ...</disp-formula>

我有一些XML文件,其中可能包含节点
,其中每个节点都有一个名为
\tag
的字符串。现在,关键字
\tag
的数量可以是每个节点
中的一个或多个

我想从1开始生成属性值
id
,然后使用
\tag
计数找到的每个
都增加到+1

样本数据:

<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>
…\tag。。。
…\tag…\tag…\tag。。。
…\tag。。。
…\tag…\tag。。。
预期修改:

<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>
…\tag。。。
…\tag…\tag…\tag。。。
…\tag。。。
…\tag…\tag。。。
对于生成特定字符串的数字,我基本上使用以下过程:

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);  
    }  
}
string inputText=File.ReadAllText(@“C:\temp\sample.xml”);
字符串findText=@“*”;
int matchCount=inputText.Split(findText.ToCharArray()).Length-1;
如果(匹配计数>0)
{  
对于(int counter=1;counter像这样尝试

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");
static void Main(字符串[]args)
{
变量xmlStr=
@"
…\tag。。。
…\tag…\tag…\tag。。。
…\tag。。。
…\tag…\tag。。。
";
var xml=XElement.Parse(xmlStr);
int x=0;
xml.Elements().ToList().ForEach(节点=>
{
var count=Regex.Matches(node.Value,@“\\tag”).count;
如果(计数>0)
{
字符串开始=(x+1).ToString();
字符串结束=(x+=count).ToString();
字符串周期=end==start?start:$“{start}-{end}”;
node.Attribute(“id”).Value=“deqn”+期间;
}
});
Console.WriteLine(xml);
}

谢谢,您能解释(分解)行吗
var matchCount=devqn.Value.Select((c,i)=>devqn.Value.Substring(i)).Count(sub=>sub.StartsWith(“\\tag”));
?它返回字符串中匹配的字符串计数..为循环中的每个'disp formula'元素计算的匹配'\tag'计数。我知道,但我想知道它是如何工作的…我以前从未在LINQ中使用过2D变量
(c,I)
。“c”表示字符串的每字符数,“I”是char.Substring的索引。每个i索引都应用了子字符串,每个子字符串的匹配计数都由“startswith”找到。我建议您编写这行并调试它,这样可以更好地理解。“var Substring=devqn.Value.Select((c,i)=>devqn.Value.Substring(i)).ToList()”
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);
}