2017-05-24 16 views
1

私はいくつかのデータセットを含むxdocumentを持っており、特定のxs:elementのデータを選択できるようにしたいと考えています。例えばxd:xs:element from c#

私はコードブロックを持っている:

// get xml string 
var xmlResponse = _traineeCommands.GetTraineeDetails(personId.ToString()); 

// parse to xdocument 
var doc = XDocument.Parse(xmlResponse); 

// select specific element and children 
var traineeDetails = doc.Descendants("xs:element") 
    .Select(x => (string) x.Attribute("name") == "TraineeDetails"); 

これは私のスタックトレースです:

{ 
    "Message": "An error has occurred.", 
    "ExceptionMessage": "The ':' character, hexadecimal value 0x3A, cannot be included in a name.", 
    "ExceptionType": "System.Xml.XmlException", 
    "StackTrace": " at System.Xml.XmlConvert.VerifyNCName(String name, ExceptionType exceptionType)\r\n at System.Xml.Linq.XName..ctor(XNamespace ns, String localName)\r\n at System.Xml.Linq.XNamespace.GetName(String localName)\r\n at IceServices.IpdApi.Controllers.JobController.GetTraineeDetailsForIpd(Int32 personId) in C:\\Users\\GOWDY_N\\Source\\Repos\\IceServices\\IceServices.IpdApi\\Controllers\\JobController.cs:line 134\r\n at IceServices.IpdApi.Controllers.JobController.<Get>d__6.MoveNext() in C:\\Users\\GOWDY_N\\Source\\Repos\\IceServices\\IceServices.IpdApi\\Controllers\\JobController.cs:line 66\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Threading.Tasks.TaskHelpersExtensions.<CastToObject>d__3`1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()" 
} 

これは全体のxmlです:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope 
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
     <GetIPDTraineeDetailsResponse 
      xmlns="http://iris.co.uk/"> 
      <GetIPDTraineeDetailsResult> 
       <xs:schema id="NewDataSet" 
        xmlns="" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
        <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 
         <xs:complexType> 
          <xs:choice minOccurs="0" maxOccurs="unbounded"> 
           <xs:element name="TraineeDetails"> 
            <xs:complexType> 
             <xs:sequence> 
              <xs:element name="ID" type="xs:decimal" minOccurs="0" /> 
              <xs:element name="TRAINEE_ID" type="xs:decimal" minOccurs="0" /> 
              <xs:element name="ORG_REGISTRATION_ID" type="xs:decimal" minOccurs="0" /> 
              <xs:element name="TRAINING_SCHEME_TITLE" type="xs:string" minOccurs="0" /> 
              <xs:element name="SELF_MANAGED" type="xs:decimal" minOccurs="0" /> 
              <xs:element name="TRAINING_START_DATE" type="xs:string" minOccurs="0" /> 
              <xs:element name="ANNUAL_REVIEW_STATUS" type="xs:string" minOccurs="0" /> 
              <xs:element name="SCE_ID" type="xs:decimal" minOccurs="0" /> 
              <xs:element name="SCE_FORENAME" type="xs:string" minOccurs="0" /> 
              <xs:element name="SCE_SURNAME" type="xs:string" minOccurs="0" /> 
              <xs:element name="SCE_NAME" type="xs:string" minOccurs="0" /> 
              <xs:element name="DE_ID" type="xs:decimal" minOccurs="0" /> 
              <xs:element name="DE_NAME" type="xs:string" minOccurs="0" /> 
              <xs:element name="DE_PERSON_ID" type="xs:decimal" minOccurs="0" /> 
              <xs:element name="DE_FORENAMES" type="xs:string" minOccurs="0" /> 
              <xs:element name="DE_FORENAME" type="xs:string" minOccurs="0" /> 
              <xs:element name="DE_SURNAME" type="xs:string" minOccurs="0" /> 
              <xs:element name="DE_EMAIL_ADDRESS" type="xs:string" minOccurs="0" /> 
              <xs:element name="MENTOR_ID" type="xs:decimal" minOccurs="0" /> 
              <xs:element name="MENTOR_FORENAME" type="xs:string" minOccurs="0" /> 
              <xs:element name="MENTOR_SURNAME" type="xs:string" minOccurs="0" /> 
              <xs:element name="MENTOR_NAME" type="xs:string" minOccurs="0" /> 
              <xs:element name="MENTOR_EMAIL" type="xs:string" minOccurs="0" /> 
              <xs:element name="MENTOR_PERSONID" type="xs:decimal" minOccurs="0" /> 
              <xs:element name="SELECTED_LEVEL" type="xs:string" minOccurs="0" /> 
              <xs:element name="SELECTED_LEVEL_DESCRIPTION" type="xs:string" minOccurs="0" /> 
              <xs:element name="TRAINEE_STATUS" type="xs:string" minOccurs="0" /> 
              <xs:element name="TRAINEE_STATUS_DESCR" type="xs:string" minOccurs="0" /> 
              <xs:element name="REQUESTED_DE_PERSON_ID" type="xs:decimal" minOccurs="0" /> 
              <xs:element name="REQUESTED_DE_SURNAME" type="xs:string" minOccurs="0" /> 
              <xs:element name="REQUESTED_DE_FORENAME" type="xs:string" minOccurs="0" /> 
              <xs:element name="PENDING_DE_EMAIL" type="xs:string" minOccurs="0" /> 
             </xs:sequence> 
            </xs:complexType> 
           </xs:element> 
           <xs:element name="PersonDetails"> 
            <xs:complexType> 
             <xs:sequence> 
              <xs:element name="ID" type="xs:decimal" minOccurs="0" /> 
              <xs:element name="FORENAMES" type="xs:string" minOccurs="0" /> 
              <xs:element name="FORENAME" type="xs:string" minOccurs="0" /> 
              <xs:element name="SURNAME" type="xs:string" minOccurs="0" /> 
              <xs:element name="DOB" type="xs:string" minOccurs="0" /> 
              <xs:element name="EMPLOYER_NAME" type="xs:string" minOccurs="0" /> 
              <xs:element name="EMPLOYER_ADDRESS_1" type="xs:string" minOccurs="0" /> 
              <xs:element name="EMPLOYER_ADDRESS_2" type="xs:string" minOccurs="0" /> 
              <xs:element name="EMPLOYER_ADDRESS_3" type="xs:string" minOccurs="0" /> 
              <xs:element name="EMPLOYER_TOWN" type="xs:string" minOccurs="0" /> 
              <xs:element name="EMPLOYER_STATE" type="xs:string" minOccurs="0" /> 
              <xs:element name="EMPLOYER_COUNTRY" type="xs:string" minOccurs="0" /> 
              <xs:element name="EMPLOYER_POSTCODE" type="xs:string" minOccurs="0" /> 
              <xs:element name="REASON_NOT_WORKING" type="xs:string" minOccurs="0" /> 
              <xs:element name="IPD_STATUS" type="xs:decimal" minOccurs="0" /> 
              <xs:element name="PAYMENT_RECEIVED" type="xs:decimal" minOccurs="0" /> 
              <xs:element name="SM_PRODUCT_DESC" type="xs:string" minOccurs="0" /> 
              <xs:element name="SM_PRODUCT_PRICE" type="xs:decimal" minOccurs="0" /> 
              <xs:element name="ORIGINAL_TRAINING_START_DATE" type="xs:string" minOccurs="0" /> 
              <xs:element name="REVIEW_DATE" type="xs:string" minOccurs="0" /> 
              <xs:element name="TRANSFER_DATE" type="xs:string" minOccurs="0" /> 
              <xs:element name="ELIGIBLE_LEVEL" type="xs:string" minOccurs="0" /> 
              <xs:element name="ELIGIBLE_LEVEL_DESCRIPTION" type="xs:string" minOccurs="0" /> 
              <xs:element name="DEFAULT_LEVEL" type="xs:string" minOccurs="0" /> 
              <xs:element name="DEFAULT_LEVEL_DESCRIPTION" type="xs:string" minOccurs="0" /> 
              <xs:element name="PERSON_AIM" type="xs:string" minOccurs="0" /> 
              <xs:element name="EMPLOYEE_NUMBER" type="xs:string" minOccurs="0" /> 
              <xs:element name="IPD_SIGNUP_DATE" type="xs:string" minOccurs="0" /> 
              <xs:element name="REQUESTED_MENTOR_PERSON_ID" type="xs:decimal" minOccurs="0" /> 
              <xs:element name="REQUESTED_MENTOR_SURNAME" type="xs:string" minOccurs="0" /> 
              <xs:element name="REQUESTED_MENTOR_FORENAME" type="xs:string" minOccurs="0" /> 
              <xs:element name="PENDING_MENTOR_EMAIL" type="xs:string" minOccurs="0" /> 
              <xs:element name="PENDING_AIM" type="xs:string" minOccurs="0" /> 
             </xs:sequence> 
            </xs:complexType> 
           </xs:element> 
          </xs:choice> 
         </xs:complexType> 
        </xs:element> 
       </xs:schema> 
       <diffgr:diffgram 
        xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 
        xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> 
        <NewDataSet 
         xmlns=""> 
         <TraineeDetails diffgr:id="TraineeDetails1" msdata:rowOrder="0"> 
          <ID>40798297</ID> 
          <SELF_MANAGED>0</SELF_MANAGED> 
         </TraineeDetails> 
         <PersonDetails diffgr:id="PersonDetails1" msdata:rowOrder="0"> 
          <ID>40798297</ID> 
          <FORENAMES>Alan Gibson</FORENAMES> 
          <FORENAME>Alan</FORENAME> 
          <SURNAME>Mordey</SURNAME> 
          <DOB>21/10/1945</DOB> 
          <EMPLOYER_NAME>Atkins</EMPLOYER_NAME> 
          <EMPLOYER_ADDRESS_1>The Axis</EMPLOYER_ADDRESS_1> 
          <EMPLOYER_ADDRESS_2>10 Holliday Street</EMPLOYER_ADDRESS_2> 
          <EMPLOYER_TOWN>BIRMINGHAM</EMPLOYER_TOWN> 
          <EMPLOYER_STATE>West Midlands</EMPLOYER_STATE> 
          <EMPLOYER_COUNTRY>UK</EMPLOYER_COUNTRY> 
          <EMPLOYER_POSTCODE>B1 1TF</EMPLOYER_POSTCODE> 
          <IPD_STATUS>0</IPD_STATUS> 
          <PAYMENT_RECEIVED>0</PAYMENT_RECEIVED> 
          <SM_PRODUCT_DESC>Mentor Support Training</SM_PRODUCT_DESC> 
          <SM_PRODUCT_PRICE>340.75</SM_PRODUCT_PRICE> 
          <ELIGIBLE_LEVEL>UNK</ELIGIBLE_LEVEL> 
          <ELIGIBLE_LEVEL_DESCRIPTION>Unknown</ELIGIBLE_LEVEL_DESCRIPTION> 
          <DEFAULT_LEVEL>ENGTECH</DEFAULT_LEVEL> 
          <DEFAULT_LEVEL_DESCRIPTION>EngTech</DEFAULT_LEVEL_DESCRIPTION> 
          <PERSON_AIM>CENG</PERSON_AIM> 
         </PersonDetails> 
        </NewDataSet> 
       </diffgr:diffgram> 
      </GetIPDTraineeDetailsResult> 
     </GetIPDTraineeDetailsResponse> 
    </soap:Body> 
</soap:Envelope> 

私が選択したいです私のスキーマ内のxs:elementのTraineeDetailsを返し、値としてIEnumerableの値を返します。この場合、IEnumerable of XEle ments。これにより、次の値が返されます。

<TraineeDetails diffgr:id="TraineeDetails1" msdata:rowOrder="0"> 
    <ID>40798297</ID> 
    <SELF_MANAGED>0</SELF_MANAGED> 
</TraineeDetails> 

アイデアをお持ちですか?シンプルにする必要があるようですが、子孫を選択する際にスタックトレースエラーが発生します。

+0

はこれを試してみてください。 LocalName == "element") – jdweng

+1

基本的なテキストを画像として掲示しないでください。あなたは非常に簡単にテキストをコピーして質問に貼り付けることができました。それ以上の場合、[mcve]の一部として* minimal *バージョンが作成されました。 –

+0

さらに、そのXMLは実際の* data *ではなく、ただスキーマです... –

答えて

0

この記事ではフィードバックに基づいて、あなたはXElementsのIEnumerableをを子孫を選択して、戻って返すためにこれを使用することができます:

var traineeDetails = xDocument.Descendants("TraineeDetails"); 

それは、これらの値を選択するために、C#でLINQを使用することも可能だが、私は終わりましたオプション1使用:

var traineeDetails = from c in doc.Descendants("TraineeDetails ") select c; 
+0

ええ、なぜ 'from ... select'を使うのですか?' var traineeDetails = doc.Descendants( "TraineeDetails"); '?私はあなたが実際に最後にスペースを持っていないと思う... –

+0

また、私はあなたが示したXMLの要素を選択するとは思わないが、これは基本的にスキーマであり、実際のデータではない。 –

+0

@JonSkeet私の間違いですが、質問をXMLデータで更新しました(XMLのスキーマではありません)。 –

1

をお示しXMLでxsプレフィックスの名前空間宣言はありません。あなたのXMLファイルは整っていますか?これはありませんか?

xmlns:xs="http://www.w3.org/2001/XMLSchema" 

ない場合は、接頭辞付きの要素を照会するたびに、あまりにも名前空間を追加することを確認します。var traineeDetailsの=のdoc.Descendants()ここで、(X => x.Name:。

XNamespace xs = "http://www.w3.org/2001/XMLSchema"; 
IEnumerable<XElement> elements = doc.Descendants(xs + "element");