在文本字符串中查找值

时间:2016-07-12 15:20:33

标签: c# asp.net .net xml parsing

我正在阅读XML文件,但这些未正确形成,所以我通过文字功能阅读它们。我的问题是我需要从不同的标签中获取值,例如:

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 =&#34; TASA DE RECOLECCION DE BASURA(WHATEVER)........... 5.490 .............(更多数据)....&# 34; 但我只想要数值(5.490)

结果如下: grid

我无法获得数值。

有没有办法让他们? 拜托,我希望有人能帮助我。

最好的问候

3 个答案:

答案 0 :(得分: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

如果允许使用空格来继续小数值,则可以对模式稍作更改。例如。将模式更改为:“\”。+?\“\&gt;(\ 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

答案 1 :(得分: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());
}

答案 2 :(得分:0)

这里的问题是你的正则表达式。如果使用以下模式替换模式,则可以从MyNumber组中获取数字。 &LT; &GT;&LT(\ d \ d {3}?); &GT;