0

LINQ to XML を使用して xml ファイルを読み取ることができません。xml スキーマの一部を添付しました。

 <?xml version="1.0" encoding="UTF-8"?>
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mstns="http://tempuri.org/sdnList.xsd" xmlns="http://tempuri.org/sdnList.xsd" elementFormDefault="qualified" targetNamespace="http://tempuri.org/sdnList.xsd" id="sdnList">
  -<xs:element name="sdnList"> 
    -<xs:complexType> 
      -<xs:sequence> 
        -<xs:element name="publshInformation" maxOccurs="1"> 
         -<xs:complexType> 
          -<xs:sequence> 
             <xs:element name="Publish_Date" maxOccurs="1" minOccurs="0" type="xs:string"/> 
            <xs:element name="Record_Count" maxOccurs="1" minOccurs="0" type="xs:int"/> 
           </xs:sequence> 
          </xs:complexType> 
         </xs:element> 
       -<xs:element name="sdnEntry" maxOccurs="unbounded"> 
         -<xs:complexType> 
           -<xs:sequence> 
              <xs:element name="uid" type="xs:int"/> 
              <xs:element name="firstName" minOccurs="0" type="xs:string"/> 
              <xs:element name="lastName" type="xs:string"/> 
              <xs:element name="title" minOccurs="0" type="xs:string"/> 
              <xs:element name="sdnType" type="xs:string"/> 
              <xs:element name="remarks" minOccurs="0" type="xs:string"/> 

              ....CONTINUES FROM HERE

私が使用しているコードは次のとおりです。

            XDocument doc = XDocument.Load("c:/OFACTemp/sdn.xml");

            var sdnEntry = from item in doc.Root.Descendants("sdnEntry")
                           select new
                           {
                               uid = item.Element("uid").Value,
                               firstName = item.Element("firstName").Value
                           };

            string test = "";
            foreach (var p in sdnEntry)
                test = "Id: " + p.uid + " First Name: " + p.firstName;  

コードをブレークすると、doc が正常に読み込まれ、適切なデータが表示されます。Doc.Root は設定されていますが、子孫には何もないように見えます。次に、 foreach ステートメントに至るまで、 sdnEntry は結果をもたらしません。これはとても単純に思えますが、何も選択できない理由がわかりません。また、子孫の代わりに Elements を使用してみましたが、同じ結果になりました。最終結果 xml を取得して C# オブジェクトを作成する必要があります。

さらに、副次的な質問として、sdnEntry の一部にファースト ネームが含まれていて、他の sdnEntry に含まれていない場合、sdnEntry はどのように処理されるのでしょうか。sdnEntry の名が存在しない場合、firstName 要素タグは xml ファイルにも存在しません。どんな助けでも大歓迎です。

xml のサンプルを次に示します。

<?xml version="1.0" standalone="true"?>
-<sdnList xmlns="http://tempuri.org/sdnList.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
  -<publshInformation> 
     <Publish_Date>05/16/2013</Publish_Date> 
     <Record_Count>5493</Record_Count>
   </publshInformation> 
   -<sdnEntry> 
     <uid>10</uid> 
     <lastName>ABASTECEDORA NAVAL Y INDUSTRIAL, S.A.</lastName> 
     <sdnType>Entity</sdnType> 
    -<programList> 
       <program>CUBA</program> 
     </programList> 
    -<akaList> 
      -<aka> 
         <uid>4</uid> 
         <type>a.k.a.</type> 
         <category>strong</category> 
         <lastName>ANAINSA</lastName> 
       </aka> 
     </akaList> 
    -<addressList> 
      -<address> 
         <uid>7</uid> 
         <country>Panama</country> 
         </address> 
     </addressList>  
   </sdnEntry>
4

3 に答える 3

4

デフォルトの名前空間を考慮する必要があります。LINQ to XML では、宣言することでそれを行います。

XNamespace df = "http://tempuri.org/sdnList.xsd";

または代わりに動的に

XNamespace df = doc.Root.Name.Namespace;

次に、オブジェクトを使用してクエリで sXNamespaceを構築する必要があります。XName

       var sdnEntry = from item in doc.Root.Descendants(df + "sdnEntry")
                       select new
                       {
                           uid = (string)item.Element(df + "uid"),
                           firstName = (string)item.Element(df + "firstName")
                       };
于 2013-05-26T09:07:06.450 に答える
0

この部分を一番上の行から削除するとうまくいきました。なぜこのようになっているのかわかりません。しかし、それはうまくいきました。xmlns:mstns="http://tempuri.org/sdnList.xsd"

于 2015-03-05T09:25:10.210 に答える
-1

問題を解決するために XmlSerializer を使用することになりました。xml ファイルが FTP 経由でダウンロードされたら、次のコードを使用しました。その後、C# を使用して C# オブジェクトを作成することができました。

FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();               
StreamReader sreader = new StreamReader(responseStream);
string xmlString = sreader.ReadToEnd();        
XmlSerializer serializer = new XmlSerializer(typeof(sdnList));
TextReader reader = new StringReader(xmlString); 
sdnList = (sdnList)serializer.Deserialize(reader);
于 2013-06-11T13:06:48.683 に答える