我正在阅读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)
我无法获得数值。
有没有办法让他们? 拜托,我希望有人能帮助我。
最好的问候
答案 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;