C# 通过使用LINQ 2 xml计算特定字符串来生成文件的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>
,其中每个节点都有一个名为\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);
}