2013-06-13 2 views
1

전구체을 XmlDocument

당신이 정말로 알 필요는 없지만, 문제 해결에 도움이 될 비트를 사용하여 중첩 된 XML 속성 값을 얻기 나는 것을, LINQPad에서 C#을 일련의 문장을 쓰고 있다는 것입니다 ELMAH (오류 로깅 시스템) 데이터베이스에서 레코드 컬렉션을 가져 와서 각 레코드에서 XML (AllXml) 필드를 추출하고 각 추출을 XmlDocument에로드합니다. 그래, 꽤 쉬워 보이지만 지금은 각 문서를 훑어보고 특정 값을 얻어야한다.

는 XML 구조의 예

참고 : 나는

<error type="System.Exception" time="2013-06-11T17:27:28.0122874Z"> 
    <item name="PATH_INFO"> 
     <value string="/foo/bar/thisIsTheValueIWant.aspx" /> 
    </item> 
    <item name="PATH_TRANSLATED"> 
     <value string="C:\site\foo\bar\thisIsPotentiallyAnotherValueIMightWant.aspx" /> 
    </item> 
    <item name="QUERY_STRING"> 
     <value string="meh" /> 
    </item> 
</error> 

이 XML 문자열로 존재하는 것을 고려 ... 어떤 잠재적으로 기밀 정보를 여기에서 제거했다, 그래서 같이이로드 한 :

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xmlString); 

문제점

노드의 값을 얻는 것은 그리 어렵지 않지만이 경우 노드의 속성으로 값이 저장되며 그 값을 통과하는 방법을 알지 못합니다!

나는 기본적으로 name, "PATH_INFO"으로 item 노드에 중첩 된 value 노드를 취득하고 "string" 속성의 값을 얻을 필요가있다.

어떻게하면됩니까?

+0

내가 물어 봐도 될까요? 그것은 2008 년 XDocument와 XElement에 의해 대체되었습니다. –

+0

@JoeAlbahari, 나는 XDocument와 XElement에 의해 2008 년에 대체되었다는 사실을 모르고 있었기 때문에 XmlDocument를 사용하고 있습니다. :-) ... 저는 이제 이것을 알고 있습니다. 아마도 약간의 연구와 리팩토링을위한 시간 일 것입니다! – series0ne

+1

XDocument의 많은 장점 중 하나는 XPath를 배울 필요가 없다는 것입니다. 다른 종류의 컬렉션을 쿼리하는 것과 같은 방법으로 LINQ를 쿼리합니다. 문자열 결과 = (문자열) XElement.Parse (xmlString) .Elements ("항목") 단일 (i => (문자열) i.Attribute ("이름") == "PATH_INFO") .Element ("value"). 특성 ("string") –

답변

2

[XmlNode 개체를 얻은 후에는 Attributes 컬렉션을 요청하고 이름으로 원하는 개체를 얻을 수 있습니다.

예 : 당신을 XmlDocument를 사용하는 이유

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xmlString); 
XmlNode itemNode = doc.SelectSingleNode("/error/item[@name = 'PATH_INFO']"); 
if (itemNode != null) 
{ 
    XmlNode value = itemNode.SelectSingleNode("value"); 
    String valueString = value.Attributes["string"].Value; 
} 
+0

Works! :-) 감사!. 계층 구조에서 태그를 놓치지 않았 더라면 도움이되었을 것입니다! * FacePalm * – series0ne

+0

LOL. 그것은 일어난다. 천만에요 :) – DonBoitnott

1
 XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(xmlString); 
     var value = doc.SelectSingleNode("error/item[@name='PATH_INFO']/value/@string").Value;