2013-06-09 1 views
1

나는이 KML을로드하고 콘텐츠하더라도 비어 파일 내용으로XDocument.Descendants()는 거기하여 XDocument

그러나 자손에 액세스하려고 할 때 아무리 나도 비어있게됩니다. 위의 코드에서

var xDoc = XDocument.Load("Assets/McBikeRoutes.kml"); 
    var d = xDoc.Descendants(); // <-- Empty result 

는 McBikeRoutes.kml는 온라인의 내부 대신을 얻고 있으므로 위의 링크 된 파일의 정확한 복사, 난 그냥 수동으로 프로젝트에 추가됩니다.

또한 xDoc이 파일을로드한다는 것을 확인할 수 있습니다. 디버거에서 관찰 한 것처럼 완전한 KML 문서 내용이 포함되어 있습니다.

그러나 내가 어떻게 자손에 액세스하려고하는지는 결과가 항상 비어 있습니다.

문서에 기본 네임 스페이스와 다른 모든 네임 스페이스를 포함 시키려고했지만 결과가 없습니다.

나는 마침내 방금 xDoc.Descendants()를 시도하여 모든 것을 얻었으며이 결과도 비어있게되었습니다!

xDoc.Root.Descendants() 및 xDoc.Document.Descendants()뿐만 아니라 xDoc.Elements(), xDoc.Root.Elements() 및 xDoc.Document.Elements()를 시도하고 EVERTHING은 XDocument에 정보가 분명히 있음에도 불구하고 빈 결과.

이상하게도 내가 할 경우 :

((XElement)xDoc.FirstNode) 

내가 처음 자손하여 XElement를받을 수 있나요! 하지만 이렇게하면 :

((XElement)xDoc.FirstNode).Descendants() 

나는 여전히 요소()를 시도했을 때 동일한 결과를 얻지 못했습니다!

아무도 내가 여기서 잘못하고있는 어떤 생각이 있습니까? 그 문서가 KML이기 때문입니까?

+0

중요한지 확실하지 않지만 DocumentType이 null 인 경우 XDocument뿐입니다. – SelAromDotNet

+0

xDoc.FirstNode가 doc ...에있는 첫 번째 노드의 XNode를 반환하지만 xDoc.Nodes()도 비어 있습니다. – SelAromDotNet

+0

'((XElement) xDoc.FirstNode'에는 균형 잡힌 대괄호가 없습니다.최소한의 실패 사례를 위해 코드를 게시하고 값을 표시하는 것이 유용 할 수 있습니다 (예 : 인쇄물을 통해). 그것은 당신이 잘못 요소를 캐스팅하는 것일 수 있습니다 –

답변

0

지금 답변으로 전송 중입니다. 당신이 더 자손을 얻을 것이다 가능성이 높다 잘못된 인수 Descendants(XName)를 호출 할 경우

은 자손에 대한 두 가지 방법() http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.descendants.aspx

Public method Descendants() 
    Returns a collection of the descendant elements for this document or element, 
    in document order. (Inherited from XContainer.) 
Public method Descendants(XName) 
    Returns a filtered collection of the descendant elements for this 
    document or element, in document order. Only elements that have a 
    matching XName are included in the collection. (Inherited from XContainer.) 

을 수 있습니다. Descendants() [sic]을 사용하면 모든 자손을 얻을 것으로 기대됩니다.

FirstNode이 비어 있지 않은 대답을주는 이유는 인수로 동작을 변경할 수 없다는 것입니다. 따라서 을 올바르게 호출하는 것을 피할 수 없습니다.

하십시오 는 실제 코드

UPDATE 게시 할 수 있습니다. 이 토론은 문제를 해결하는 가장 효과적인 방법은 아닙니다. SSCCE (https://meta.stackexchange.com/questions/22754/sscce-how-to-provide-examples-for-programming-questions) "단락, 자체 포함, 수정 (컴파일 가능), 예를 구성해야합니다."

SMALL 예제를 만드는 것입니다. KML 파일을 가져 와서 읽을 수 있고 실패한 것으로 보이는 방법을 명시 적으로 표시 할 수있는 최소한의 유효한 하위 집합을 만듭니다. 그것은 문제가 KML이라고 생각하지 않을 것입니다 - 나는 당신이 메서드를 호출하는 방법과 당신이 기대하는 바를 생각합니다.) 나는 XML 문자열을 읽으려고 노력할 것이고 그래서 여러분은 코드를 게시 할 수 있습니다. "empty"와 같은 단어는 정확하지 않습니다 - IEnumeration이 일부 함수에 의해보고 된 요소가 0임을 의미합니까? (XDocument 지식은 몇 년 전입니다)

If 당신을 도울 수있는 SSCCE를 만드십시오. (나는 잘 모릅니다.) 그러나 적어도 우리는 당신을 표현할 수 있습니다. 문제를 정확하게 말하십시오. 당신은 내가 잘못되고있는 것이 무엇인지에 대한 추측을하여야한다 코드 게시하지 않은 이후 :

UPDATE 실제로) 네 자손() 및 요소 (않는 노드를 포함하지만 당신은 제대로 심문되지 않습니다. 코드를 게시 한 경우 훨씬 적은 시간을 들여 답을 얻을 수 있습니다.

업데이트 디버거 스냅 샷을 보내 주셔서 감사합니다. 나는 이것이 문제가 처음에 드러난 곳이라고 추측했다. 첫째, 정확한 용어를 사용해야합니다. 즉, "비어 있음"을 썼지 만 디버거는이를 "null"로 표시합니다. 그들은 완전히 다르며 다른 하나를 사용하면 오도됩니다.

내 생각에 당신이 디버거를 사용하여 하위 요소를 나타낼 수 없다는 의심이 들었습니다. 나는 당신과 당신의 디버거가 서로를 이해하지 못한다고 생각합니다. 이것은 그물을 통해 디버깅하는 것은 불가능합니다.

자손()를 IEnumerable입니다 :

public IEnumerable<XElement> Descendants() 

내 C#을/Linq에 녹슨 내가이 작업 시스템을 가지고 있지 않지만 일반적인 용어로이 그것을 위해 요소를 얻는 방법을 제공하는 것을 의미한다. 당신은 CODE (안 디버거)의 후손을 얻는 방법 일을해야 할 것

하는 GetEnumerator() (http://msdn.microsoft.com/en-us/library/s793z9y2.aspx)

그래서 당신은 IEnumerable을 통해 반복하는 방법을 배울 필요가있다 : 그것의 유일한 방법은 . 메모리에서이 같은 것입니다 :

foreach (XElement descendant : getDescendants()) { 
    printSomehowOrDoSomething(descendant); 
} 

당신은 당신이 중 하나를 당신이 원하는 것을 할 것이다 또는 당신이 당신의 문제가 훨씬 명확하게 생각을해야합니다 다음, 사용하고 실행하고자하는 실제 코드를 작성하는 경우 당신을 통신 할 수 있습니다. (왜 당신의 디버거가 "null"이라고 쓰는지 모르겠다. 기술적으로는 올바르지 만 오도 된 것일 수도있다.) 화면 캡 (+ 버튼)은 열거 형에 자식이 있음을 암시한다 ..

간단히 : 디버거를 잊어 버린다. 을 실행하려는 코드를 첫 번째 인스턴스에서 가능한 한 간단하게 작성하십시오 (10 줄 이하). 작은 조각 (SSCCE)의 값은 다른 사람들이 즉시 재현 할 수 있다는 것입니다. 잘라 내기 및 붙여 넣기가 가능합니다 자신의 시스템에서 실행하십시오. 코드와 오류는 디버거보다 훨씬 정확합니다 .BTW Unit Testing 및 Test-Driven 개발을 사용하기를 바랍니다. 실패한 테스트를 작성한 경우 문제가 발생한 위치가 분명합니다.

+0

당신은 "당신이 자손을 사용하면() 나는 모든 자손을 얻을 것으로 기대합니다"라고 말하면 그것이 내가 기대할 것입니다. 내가 요청한대로 코드를 게시했지만, 말했듯이, 나는 문자 그대로 문서를로드하고 XDocument의 자손을 확인하고 있습니다. 실제로 XDocument의 내용을 보면 xml 내용이 모두 있지만 실제로 시도해도 아무 것도 Descendants에서 얻을 수 없습니다. – SelAromDotNet