요소 이름과 속성이 입력 노드와 일치하는 xlement를 찾으려면 LINQ 표현이 필요합니다.

StackOverflow https://stackoverflow.com/questions/155685

문제

요소 이름과 모든 속성 이름과 값이 입력 요소와 일치 할 때 Xlement 계층 구조에서 노드의 내용을 교체해야합니다. (일치가 없으면 새로운 요소를 추가 할 수 있습니다.)

예를 들어 내 데이터가 다음과 같이 보이는 경우

<root>
  <thing1 a1="a" a2="b">one</thing1>
  <thing2 a1="a" a2="a">two</thing2>
  <thing2 a1="a" a3="b">three</thing2>
  <thing2 a1="a">four</thing2>
  <thing2 a1="a" a2="b">five</thing2>
<root>

이 입력으로 메소드를 호출 할 때 마지막 요소를 찾고 싶습니다.

<thing2 a1="a" a2="b">new value</thing2>

이 메소드에는 하드 코딩 된 요소 또는 속성 이름이 없어야합니다. 단순히 데이터 입력과 일치합니다.

도움이 되었습니까?

해결책

주어진 요소가 정확한 태그 이름 및 속성 이름/값 쌍과 일치합니다.

public static void ReplaceOrAdd(this XElement source, XElement node)
{
    var q = from x in source.Elements()
            where x.Name == node.Name
            && x.Attributes().All(a =>node.Attributes().Any(b =>a.Name==b.Name && a.Value==b.Value))
            select x;

    var n = q.LastOrDefault();

    if (n == null) source.Add(node);
    else n.ReplaceWith(node);                                              
}

var root = XElement.Parse(data);
var newElem =XElement.Parse("<thing2 a1=\"a\" a2=\"b\">new value</thing2>");

root.ReplaceOrAdd(newElem);

다른 팁

당신은 경로로 xpathselectelement를 할 수 있습니다 (나를 인용하지 말고 막대에 가졌습니다. 아침을 청소할 것입니다) /root /the2 [ @a1 = 'a'및 @a2 = 'b'] 그런 다음 가져갑니다. lastordefault () (xpathselectelement는 System.linq.xml의 확장 메소드입니다).

그것은 당신이 당신이 변경하고자하는 노드를 얻을 것입니다. 그러나 어떻게 변경하고 싶은지 잘 모르겠습니다. 결과는 실제 Xlement이므로 변경하면 트리 요소가 변경됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top