2017-10-02 7 views
0

私はサードパーティのXMLパーサを使用しています(私の判断ではありません)。ここではXMLタグの内側の一部である:引用された属性を持つXMLを解析する

"Date=""2014-01-01"" Amounts=""100717.72 100717.72 100717.72 100717.72""" 

属性を解析するために、コードは、引用符を無視して、スペース上の.splitを行います。空白文字列がない限り、これはうまく動作しますが、ここにはあります。これは適切なDate = 2014-01-01と半正当なAmounts = 100717.72を返しますが、その後はさらに4つのエントリだけを返します。

私はパーサー用のC#コードを持っており、スペース内引用符を他の文字、分割、およびそれらの変更に置き換えることを考えました。しかし、私はまずここで尋ねるべきだと思った。

このテキストを2つのエントリに正しく解析する方法はありますか?

UPDATE:元のXMLは、次の(別のコンピュータからで入力し、私を許して!)

<DetailAmounts Date="2014-01-01" Amounts="100717.72 100717.72 100717.72 100717.72" /> 
+0

これはあなたが制御できないものとして与えられた属性ですか?二重二重引用符は常に存在しますか?すべての番号も必要ですか? – Xiaoy312

+0

この属性はサードパーティのサーバーによって生成されたテキストファイルからのもので、そこにはアクセスしません。二重引用符は元のファイルにはありません。おそらくデバッガの出力に何か起きているようです。私はすべての数を必要とする、私は2つのアイテムを取得する必要があります、2つ目はAmounts =文字列全体です –

+1

これは有効なxmlです。あなたが使うパーサは悪いです。なぜネットの通常のxml機能(xmlserializerなど)を使用しないのですか? – Styxxy

答えて

1

あなただけのデータをデシリアライズするためにXmlSerializerを使用する必要があります。

public class DetailAmounts 
{ 
    [XmlAttribute] 
    public DateTime Date { get; set; } 
    [XmlAttribute] 
    public string Amounts { get; set; } 
} 

// ... 

var xml = "<DetailAmounts Date=\"2014-01-01\" Amounts=\"100717.72 100717.72 100717.72 100717.72\" />"; 
var serializer = new XmlSerializer(typeof(DetailAmounts)); 
using (var reader = new StringReader(xml)) 
{ 
    var detailAmounts = (DetailAmounts)serializer.Deserialize(reader); 
} 

または、することができますそれぞれの値を解析するにはXElementを使用してください:

var xml = "<DetailAmounts Date=\"2014-01-01\" Amounts=\"100717.72 100717.72 100717.72 100717.72\" />"; 
var element = XElement.Parse(xml); 
var detailAmounts = new 
{ 
    Date = (DateTime)element.Attribute("Date"), 
    Amounts = element.Attribute("Amounts").Value.Split(' ') 
     .Select(x => decimal.Parse(x, CultureInfo.InvariantCulture)) 
     .ToArray() 
}; 
関連する問題