안녕하세요 저는 xml 파일을 다루고 있었고 해결하는 데 약간의 문제가 있음을 알 렸습니다.
루트 노드로 시작하고 이름을 변경할 수있는 다른 자식 노드가있는 Xml이 있습니다. 예를 들면 다음과 같습니다.
<root>
<Child1>
</root>
그래서 "Child1"을 "Child2"또는 "Child3"으로 변경할 수 있다는 점을 감안하면이 linq가 내 방식대로 이름을 추출 할 수 있도록했습니다.
먼저:
XElement root = XElement.Parse(xml);
var childType = root.Descendants().First(x => x.Name == "Child1" || x.Name == "Child2"|| x.Name == "Child3").Name;
따라서 위와 같이 네임 스페이스가없는 xml이 있으면 제대로 작동하고 노드 태그에서 이름을 추출 할 수 있습니다.
하지만 루트 태그에 네임 스페이스가 있으면 오류가 발생합니다.
<root xmlns="namespace">
<Child1>
</root>
동일한 linq를 통과하는 XML은 다음을 던집니다.
시퀀스에 일치하는 요소가 없습니다.
귀하의 root
요소는 정의 된 네임 스페이스 (있다 xmlns="namespace"
, 따라서 모든 자식 요소가 같은 네임 스페이스와 연관됩니다). 즉, Child1
요소는 동일한 네임 스페이스에 있으며 이름에는 네임 스페이스 접두사와 로컬 이름 ( "Child1"
)이 모두 포함됩니다 . 따라서 Child1
요소를 검색 할 때 전체 이름을 지정할 수 있습니다 .
var ns = root.GetDefaultNamespace();
var childType = root.Descendants()
.First(x => x.Name == ns +"Child1" || x.Name == ns + "Child2"|| x.Name == ns + "Child3")
.Name;
또는 찾을 수 있습니다 x.Name.LocalName
(하지만 Child1
다른 네임 스페이스의 요소 가있을 가능성은 적지 만이 접근 방식을 권장하지는 않습니다 ).
참고 : Child
요소에 닫는 태그가 없습니다 (오타 일 가능성이 있음).
추가 자료 : Xml 네임 스페이스
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다