2016-07-12 5 views
1

私はXMLファイルを読んでいますが、これらのは正しく形成されていません。だから、私はそれらをテキスト関数で読みます。私の問題は、私は、たとえば、diferentあるタグから値を取得する必要があるということです。テキスト文字列で値を見つけよう

xml

私は必要なもの、たとえば、最後のタグからの値である:15.000、9.490および9.220。

私はファイルを読む:

public string Leer(string archivo) 
{ 
    string texto; 
    using (var streamReader = new StreamReader(archivo, Encoding.UTF8)) 
    { 
     texto = streamReader.ReadToEnd(); 
    } 
    return texto; 
} 

私は数値が含まれているstrigのセグメント、読んで:私は値から数値のみを単離するため、正規表現を使用して取得しようと

public string getRango(string strSource, string strStart, string strEnd) 
{ 
    int Start, End; 
    if (strSource.Contains(strStart) && strSource.Contains(strEnd)) 
    { 
     Start = strSource.IndexOf(strStart, 0) + strStart.Length; 
     End = strSource.IndexOf(strEnd, Start); 
     return strSource.Substring(Start, End-3500); 
    } 
    else 
    { 
     return ""; 
    } 
} 

をテキスト。

public string extraerValor(string str) 
{ 
    string patron = @"\d+(\.\d{1,3})?"; 
    string input = ""; 

    if (System.Text.RegularExpressions.Regex.IsMatch(str, patron)) 
    { 
     input = Regex.Replace(str, "[a-zA-Z]*", string.Empty); 
     return input; 
    } 
    else 
    { 
     return "Nada"; 
    } 
} 

だから、私は私が読んですべての値を取得するためのDataTableを使用します。

CartDT.Columns.Add("rango", typeof(string)); 
    CartDT.Columns.Add("ValorExtraido", typeof(string)); 
    CartDT.Columns.Add("nombreArchivo", typeof(string)); 

を私は値を読み、GridViewのに送信:

foreach (string file in Directory.EnumerateFiles(directoryPath, "*.xml")) 
    { 
     try 
     { 
      string lecturaXML = b.Leer(file); 
      string nombreArchivo = Path.GetFileNameWithoutExtension(file); 

      dr = CartDT.NewRow(); 
      dr["rango"] = b.getRango(lecturaXML, "<campoAdicional nombre=" + @"""TASA DE RECOLECCION DE BASURA", "</campoAdicional>"); 
      dr["ValorExtraido"] = b.extraerValor(b.getRango(lecturaXML, "<campoAdicional nombre=" + @"""TASA DE RECOLECCION DE BASURA", "</campoAdicional>").ToString()); 
      dr["nombreArchivo"] = nombreArchivo; 


      CartDT.Rows.Add(dr); 


     } 
     catch (System.Xml.XmlException)//Excepcion en caso de xml mal formado 
     { } 

    } 

    //mandar la informacion a la grilla 
    gvwFacturas.DataSource = CartDT; 
    gvwFacturas.DataBind(); 

} 

それは意味、私がしたいです読んでください: campoAdicional nombre = "TASA DE RECOLECCION DE BASURA(まったく)............. 5.490 .............(もっとデータ)...." しかし、私は数値(5.490)

この結果: grid

そして、私は数値を取得することはできません。

これを入手する方法はありますか? お願い、誰でも私を助けてくれることを願っています。

よろしく

+0

なぜあなたはそれを解析し、未形成のデータを期待しようとすることができますが、それだけでハックの上にハックを要求し、適切に形成されていないデータである – 10100111001

+0

何彼らは "彼らは正しく形成されていない"という意味ですか、明確に最初のポイントは、XMLを修正する必要がありますし、XDocumentまたはXmlDocumentクラス – Haris

答えて

0

それはあなたがちょうどあなたがしたい部分を見つけるために、ワイルドカード検索のフォームを使用する必要があり、XMLが正しく形成されていないことではありません。 XDocumentを使用して

は、はるかに信頼性の高いラインにより、このデータラインの解析よりになるだろう:

var doc = XDocument.Load("Data.xml"); 
var vals = from n in doc.Descendants("campAdicional") where n.Attribute("nombre").Value.ToString().StartsWith("TASA DE RECOLECCION DE BASURA") select n; 
foreach (XElement x in vals) 
{ 
    Debug.WriteLine(x.Value.ToString()); 
} 
0

ここでの問題は、あなたの正規表現です。パターンを以下のパターンに置き換えた場合は、MyNumberグループから番号を取得できます。 <。 >(?¥d。¥d {3})<。>

1

タグの形式が不明な場合は、正規表現のパターンマッチングを使用できます。私は基本的な例を一緒に投げたが、それは正しい道にあなたを得なければならない。

using System.Text; 
using System.Text.RegularExpressions; 
using System.Threading.Tasks; 

namespace ParsingDemo 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var matches = Regex.Matches(GetData(), "\".+?\"\\>\\d+\\.\\d+"); 

      foreach (Match m in matches) 
      { 
       var key = Regex.Match(m.Value, "\".+?\""); 
       var value = Regex.Match(m.Value, "\\d+\\.\\d+"); 

       Console.WriteLine("Key is " + key.Value.Trim('"')); 
       Console.WriteLine("Value is " + value.Value); 
      } 

      Console.ReadLine(); 
     } 

     static string GetData() 
     { 
      return 
       "<campoAdicional nombre=\"asdfasdhkjh fdsafhsdfkjh 1s  \">239.220</campoAdicional>" + 
       "<campoAdicional nombre=\"asdfasdhkjh fdsafhsdfkjh 213  \">1229.220</campoAdicional>" + 
       "<campoAdicional nombre=\"asdfasdhkjh fdsafhsdfkjh fds  \"> 9.220</campoAdicional>"; 
     } 
    } 
} 

、結果は以下のようになります。

Key is asdfasdhkjh fdsafhsdfkjh 1s 
Value is 239.220 
Key is asdfasdhkjh fdsafhsdfkjh 213 
Value is 1229.220 

ホワイトスペースは10進数の値を進行させている場合は、パターンにわずかな変更を行うことができます。例えば。パターンを "\"。+?\ "\>(\ s +)?\ d + \に変更します。\ D +」

結果は次のようになります?。

Key is asdfasdhkjh fdsafhsdfkjh 1s 
Value is 239.220 
Key is asdfasdhkjh fdsafhsdfkjh 213 
Value is 1229.220 
Key is asdfasdhkjh fdsafhsdfkjh fds 
Value is 9.220 
関連する問題