2017-12-24 13 views
4

일부 XML 파일에 노드 <disp-formula id="deqn*">이 포함될 수 있으며이 노드들 각각에 \tag이라는 문자열이 있습니다. 이제 키워드 \tag의 수는 각 노드 <disp-formula id="deqn*">에서 하나 이상일 수 있습니다.LINQ 2 XML을 사용하여 특정 문자열을 계산하여 파일의 xml 속성 값을 생성 하시겠습니까?

속성 값 id을 1에서 생성하고 <disp-formula id="deqn*">에 대해 +1로 증가시키고 \tag 수를 사용하여 찾았습니다.

샘플 데이터 :

<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> 

예상 수정 :

<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> 
나는 기본적으로 아래의 과정을 사용하여 특정 문자열 번호를 생성

:

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을 어떻게 사용할 수 있습니까? 이 일을 끝내기 위해서? 아무도 도와 줄 수 있습니까?

답변

3

시도해보십시오.

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

감사합니다, 당신은 라인'VAR matchCount = deqn.Value.Select ((C, I) => deqn.Value.Substring (I)) 설명 (분해) 할 수있다. 카운트 (하위 => sub.StartsWith ("\\ tag"));'? –

+0

문자열 내에서 일치하는 문자열 카운트를 반환합니다. 루프의 모든 'disp-formula'요소에 대해 계산 된 '\ tag'카운트가 일치합니다. – lucky

+0

알아요,하지만 어떻게 작동하는지 알고 싶었는데 ... 전에 LINQ에서 2D 변수'(c, i)'를 사용하지 않았습니다 ... –

0
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); 
}