如何使用 uppercase/lowercase 搜索词在 XML 中搜索?
How to search in XML both with uppercase/lowercase search term?
我正在使用 XML 文件作为数据库进行 C# 基础练习。该程序必须允许用户搜索、编辑、删除和添加一个人的注册。
搜索方法有效,但现在我想实现无论是否使用 uppercase/lowercase 个字母都可以找到此人的功能。例如,像我现在这样,如果我搜索 "MATHEUS" 并且数据库(XML 文件)有 "matheus",我的程序似乎没有找到那个人。
public static List<Entidades.Pessoa> Listar(string nome, string cpfcnpj)
{
//Variável de retorno
List<Entidades.Pessoa> pessoas = new List<Entidades.Pessoa>();
//Carrega o arquivo xml
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load("Database.xml");
//Representa uma coleção ordenada de nós.
XmlNodeList xmlNodeListPessoa = null;
if ((cpfcnpj != null) && (cpfcnpj != ""))
{
//Cria uma lista somente com a identificação informada pelo cpfcnpj
xmlNodeListPessoa = xmlDocument.SelectNodes(string.Format("Lista/Pessoa[CpfCnpj='{0}']", cpfcnpj));
}
else if ((nome != null) && (nome != ""))
{
//Cria uma lista somente com a identificação informada pelo nome
xmlNodeListPessoa = xmlDocument.SelectNodes(string.Format("Lista/Pessoa[contains(Nome,'{0}')]", nome));
//xmlNodeListPessoa = xmlDocument.SelectNodes(string.Format("Lista/Pessoa[starts-with(Nome,'{0}')]", nome));
}
else
{
//Senao criar uma lista normal
xmlNodeListPessoa = xmlDocument.SelectNodes(string.Format("Lista/Pessoa"));
}
//Carrega
foreach (XmlElement xmlElementPessoa in xmlNodeListPessoa)
{
//incializar a instancia do objeto pessoa
Entidades.Pessoa objPessoa = Entidade(xmlElementPessoa);
// adicionar objeto ba lista
pessoas.Add(objPessoa);
}
//Retorna
return pessoas;
}
我的答案非常接近,所以请查看那里的答案并仔细考虑。它与你的问题不完全匹配,因为 XPath 查询有 =
而你使用 contains
,但想法是一样的:在搜索之前将所有内容转换为小写。
尝试更改:
Lista/Pessoa[contains(Nome,'{0}')] <- nome
到
Lista/Pessoa[contains(lower-case(Nome),'{0}')] <- nome.ToLowerCase()
并确保通过 nome.ToLowerCase()
而不仅仅是 nome
。匹配的两边必须是"normalized"!
我正在使用 XML 文件作为数据库进行 C# 基础练习。该程序必须允许用户搜索、编辑、删除和添加一个人的注册。
搜索方法有效,但现在我想实现无论是否使用 uppercase/lowercase 个字母都可以找到此人的功能。例如,像我现在这样,如果我搜索 "MATHEUS" 并且数据库(XML 文件)有 "matheus",我的程序似乎没有找到那个人。
public static List<Entidades.Pessoa> Listar(string nome, string cpfcnpj)
{
//Variável de retorno
List<Entidades.Pessoa> pessoas = new List<Entidades.Pessoa>();
//Carrega o arquivo xml
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load("Database.xml");
//Representa uma coleção ordenada de nós.
XmlNodeList xmlNodeListPessoa = null;
if ((cpfcnpj != null) && (cpfcnpj != ""))
{
//Cria uma lista somente com a identificação informada pelo cpfcnpj
xmlNodeListPessoa = xmlDocument.SelectNodes(string.Format("Lista/Pessoa[CpfCnpj='{0}']", cpfcnpj));
}
else if ((nome != null) && (nome != ""))
{
//Cria uma lista somente com a identificação informada pelo nome
xmlNodeListPessoa = xmlDocument.SelectNodes(string.Format("Lista/Pessoa[contains(Nome,'{0}')]", nome));
//xmlNodeListPessoa = xmlDocument.SelectNodes(string.Format("Lista/Pessoa[starts-with(Nome,'{0}')]", nome));
}
else
{
//Senao criar uma lista normal
xmlNodeListPessoa = xmlDocument.SelectNodes(string.Format("Lista/Pessoa"));
}
//Carrega
foreach (XmlElement xmlElementPessoa in xmlNodeListPessoa)
{
//incializar a instancia do objeto pessoa
Entidades.Pessoa objPessoa = Entidade(xmlElementPessoa);
// adicionar objeto ba lista
pessoas.Add(objPessoa);
}
//Retorna
return pessoas;
}
我的答案非常接近,所以请查看那里的答案并仔细考虑。它与你的问题不完全匹配,因为 XPath 查询有 =
而你使用 contains
,但想法是一样的:在搜索之前将所有内容转换为小写。
尝试更改:
Lista/Pessoa[contains(Nome,'{0}')] <- nome
到
Lista/Pessoa[contains(lower-case(Nome),'{0}')] <- nome.ToLowerCase()
并确保通过 nome.ToLowerCase()
而不仅仅是 nome
。匹配的两边必须是"normalized"!