2011-04-25 6 views
2

구문 분석하려고하는 레거시 데이터베이스에 xml 문자열이 저장되어 있습니다. 문자열을 얻을 수 있지만 필요한 값을 얻는 데 2 ​​가지 문제가 있습니다. 먼저, 일부 샘플 xml.하위 XML 요소에 어떻게 액세스합니까?

<?xml version="1.0" encoding="utf-16"?> 
<email> 
    <meta> 
     <smartForm> 
      <unit name="ForgotUsername" label="Forgot Username Email"> 
       <textBox name="FromEmail" label="From Email" type="Email" /> 
       <textBox name="FromName" label="From Name" type="100" /> 
       <textBox name="BccEmail" label="BCC" type="EmailList" /> 
       <textBox name="Subject" label="Subject" type="300" /> 
       <textBox2 name="TextBody" label="Body" type="Memo" /> 
      </unit> 
      <unit name="ForgotPassword" label="Forgot Password Email"> 
       <textBox name="FromEmail" label="From Email" type="Email" /> 
       <textBox name="FromName" label="From Name" type="100" /> 
       <textBox name="BccEmail" label="BCC" type="EmailList" /> 
       <textBox name="Subject" label="Subject" type="300" /> 
       <textBox2 name="TextBody" label="Body" type="Memo" /> 
      </unit> 
     </smartForm> 
    </meta> 
    <value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;root&gt;&lt;ForgotPassword BccEmail="[email protected]" FromEmail="[email protected]" FromName="password test" Subject="password test" TextBody="info" /&gt;&lt;ForgotUsername BccEmail="[email protected]" FromEmail="[email protected]" FromName="test" Subject="test" TextBody="test" /&gt;&lt;/root&gt;</value> 
</email> 

문제 # 1 - 나는 XML 선언 (즉, 처음 39 자)를 제거하지 않는 한 나는 <value> 노드를 얻을 수 없다, 그러나 XElement.Parse("string")를 사용하여 XML을 구문 분석을 시도했다. 나는 그것이 취성있는 해결책이기 때문에 이것을하지 않기를 바라고있다.

문제 # 2 - 나는 <value> 요소의 내용을 가지고 있고 XElement를로 분석하면, 나는 <root> 문서 요소의 <ForgotUsername> 또는 <ForgotPassword> 자식 노드 중 하나에 쿼리를합니다. .Elements()을 받았을 때 컬렉션이 null이라고 들었습니다.

내가 뭘 잘못하고 있니?

실체를 교체 한 후 가치의 XML :

<root> 
    <ForgotPassword BccEmail="[email protected]" FromEmail="[email protected]" FromName="password test" Subject="password test" TextBody="info" /> 
    <ForgotUsername BccEmail="[email protected]" FromEmail="[email protected]" FromName="test" Subject="test" TextBody="test" /> 
</root> 

UPDATES : - :

var xdoc = XDocument.Parse(contentXml); 
return (from element in xdoc.Elements("value") 
     select element.Value).FirstOrDefault(); 
abatishchev의 초기 제안을 시도 후 나는 다음에 문제 # 1의 코드를 변경

제공된 정보를 기반으로 값 노드의 문자열을 반환해야합니다. 그러나 null을 반환합니다. xdoc.Elements() (또는 위의 스 니펫에 표시된대로)는 null을 반환합니다.

+0

당신이'XDocument.Parse()'대신'XElement.Parse()'의 시도? – dahlbyk

+0

두 가지 모두에서 동일한 결과를 얻으려고했습니다. – JamesEggers

답변

1
  • 사용 XDocument.Parse()는, 단위를 얻으려면
  • XML 선언을 지원하는 문서를 만들

    XDocument.Parse("...").Root // or Element("email") 
        .Elements("meta") 
         .Elements("smartForm") 
          .Elements("unit"); 
    
  • 을 사용하거나 사용하는 XPath를 : 당신이 쿼리 스타일을 사용할 수 있습니다 또한 email/meta/smartForm/unit

  • :

    var doc = XDocument.Parse("..."); 
    var q = from meta in doc.Root.Elements("meta") 
         from smartForm in meta.Elements("smartForm") 
         from unit in smartForm.Elements("unit") 
         select unit; 
    
  • 나를 위해 6,
+0

XDocument.Parse()로 변환 한 다음 xdoc.Elements ("meta")를 호출하면 Elements()가 null을 반환한다고 표시합니다. – JamesEggers

+0

@James : 맞습니다. 내 대답 – abatishchev

+0

을 주요 질문에 추가했습니다. – JamesEggers

1

다음 작품 :

var xd = XDocument.Load("Test.xml"); 
var xv = XDocument.Parse((string)xd.Root.Element("value")); 
Console.WriteLine(xv.Root.Elements().Count()); 

출력이 ForgotPassword 및 ForgotUsername를 들어, 2입니다. # 1의 경우

0

:

XElement doc = XElement.Load(file); 
XElement valueElement = doc.Element("value"); 
string value = (string)valueElement; 
관련 문제