요소 이름과 속성이 입력 노드와 일치하는 xlement를 찾으려면 LINQ 표현이 필요합니다.
-
03-07-2019 - |
문제
요소 이름과 모든 속성 이름과 값이 입력 요소와 일치 할 때 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이므로 변경하면 트리 요소가 변경됩니다.
제휴하지 않습니다 StackOverflow