使变量从 XML C# 读取
本文关键字:读取 XML 变量 | 更新日期: 2023-09-27 18:34:48
基于我之前的一些问题,我整理了以下内容:
var xml = "<root><Data><Info>data</Info></Data></root>";
var xmlString = (from data in XElement.Parse(xml).Descendants("Data")
where data.Descendants().Any()
select data.Descendants().First().Value).FirstOrDefault();
var fileString = File.ReadAllText(@"1.txt");
Console.WriteLine("{0}", fileString == xmlString ? 1 : 0);
上面应该加载 xml 的特定部分,加载文本文件,并比较两者。不幸的是,我是C#及其一些概念的新手,并且不确定如何使var xml = "<root><Data><Seperator>data</Seperator></Data></root>";
从同一目录中的特定xml文件中读取。
我知道我可以使用:
FileStream stream = new FileStream("1234.xml", FileMode.Open);
XmlReader reader = new XmlTextReader(stream);
while(reader.Read())
{
Console.WriteLine(reader.Value);
}
如果我有 1234.xml 并希望将其输出到控制台,但我不知道如何以定义的变量 xml 能够读取它的方式加载文件的内容。
编辑:
根据下面的帖子,我尝试使用以下方法,但它在控制台中返回空白:
using(XmlReader reader = XmlReader.Create("2.xml"))
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.Name.ToLower() == "data")
{
string xml = reader.ReadOuterXml();
var xmlString = (from data in XDocument.Parse(xml).Elements()
select data.Elements().First().Value).FirstOrDefault();
xmlString = xmlString.Replace("'n", "").Trim();
var fileString = File.ReadAllText(@"8.txt");
Console.WriteLine("{0}", fileString == xmlString ? 1 : 0);
}
}
}
}
编辑 2:
XML文件是一个哈希值和一个签名(我只是试图抓取和比较哈希及其值(:
<?xml version="1.0"?>
-<root>-<Data><Info>Hash: xxxxxxxxxxxxxxxxxxxxxxxxxxx</Info></Data>-<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">-<SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>-<Reference URI="">-<Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>GHOSJRUqcHnZ3M090/5/KhvghyQ=</DigestValue></Reference></SignedInfo><SignatureValue>oib+LAXqJshDFm3YM63qkSsJxxF+t0uahGax8tLrjSPJUjW045iYvB4LJCgMeF9oxatbWnVB9hGbvtVnl4iewJDL3kjnjvot5CLozMOaIGJgdys5MP8ncx771itANTm8wi8KgnqVjGjvTakEmcdwcSdRXuCP1WGOwuXm5StkY8Q=</SignatureValue></Signature></root>
不完全确定您的要求是什么;但是根据您的问题和评论,看起来您有一个XML文档,例如
<?xml version="1.0" encoding="utf-8"?>
<root>
<Data>
<Info>
data
</Info>
</Data>
<Data>
<Seperator>
other data
</Seperator>
</Data>
</root>
您希望从 <Data></Data>
标记中的第一个元素读取值(子元素名称可以有所不同,例如在示例中它可以是<Info></Info>
或<Seperator></Seperator>
这是解决方案(它将获得值" data
","other data
"(
using(XmlReader reader = XmlReader.Create("1234.xml"))
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.Name.ToLower() == "data")
{
string xml = reader.ReadOuterXml();
var xmlString = (from data in XDocument.Parse(xml).Elements()
select data.Elements().First().Value).FirstOrDefault();
xmlString = xmlString.Replace("'n", "").Trim();
// Your other operations
}
}
}
}
编辑
您的 xml 数据的格式不正确(元素前有不需要的连字符 (-(。如果它的格式良好,我的代码就可以工作了。您的 xml 文件应如下所示。
<?xml version="1.0"?>
<root>
<Data>
<Info>Hash: xxxxxxxxxxxxxxxxxxxxxxxxxxx</Info>
</Data>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>GHOSJRUqcHnZ3M090/5/KhvghyQ=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>oib+LAXqJshDFm3YM63qkSsJxxF+t0uahGax8tLrjSPJUjW045iYvB4LJCgMeF9oxatbWnVB9hGbvtVnl4iewJDL3kjnjvot5CLozMOaIGJgdys5MP8ncx771itANTm8wi8KgnqVjGjvTakEmcdwcSdRXuCP1WGOwuXm5StkY8Q=</SignatureValue>
</Signature>
</root>
如果您只想用文件的内容填充字符串变量,请尝试
var xml = File.ReadAllText("1234.xml");
(与"1.txt"相同(
确保你是
using System.IO;
您可以使用 XDocument 或 XElement 加载文件并对其进行Load
:
例如:
XDocument doc = XDocument.Load("1234.xml");
要从与可执行文件相同的目录加载文件,请尝试以下操作:
string path = Path.Combine(
Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]),
"1234.xml");
XElement xml = XElement.Load(path);
如果你关心,你可以使用这个库来获取哈希值:https://github.com/ChuckSavage/XmlLib/像:
string result = xml.XPathElement("//Data[*]").Descendants().First().Value;
//Data[*]
表示具有任何子节点的后代数据节点,您的公式中都有这些子节点。
但是,如果您知道您的数据将位于"数据/信息"节点中(仍在使用库(:
string info = xml.Get("Data/Info", string.Empty);
请尝试以下代码。
名为 Persons.xml 的 XML 文件,您必须使用.....
<?xml version="1.0" encoding="utf-8"?>
<Persons>
<Person>
<Name>abcd</Name>
<City>Kolkata</City>
<Sex>Female</Sex>
</Person>
</Persons>
现在,要向此XML文件添加数据,您必须创建一个表单,其中可以有三个字段名称,城市和性别字段以及相应的文本框,以及两个按钮将数据添加到XML文件和读取以从此XML文件读取数据。
现在双击添加按钮并编写以下代码...
protected void butAdd_Click(object sender, EventArgs e)
{
try
{
if (txtName.Text == "" || txtCity.Text == "" || txtSex.Text == "")
{
lblStatus.Text = "Please complete the form.";
}
else
{
XDocument xmlDoc = XDocument.Load(Server.MapPath("Persons.xml"));
xmlDoc.Element("Persons").Add(new XElement("Person", new XElement("Name", txtName.Text),
new XElement("City", txtCity.Text), new XElement("Sex", txtSex.Text)));
lblStatus.Text = "Data successfully added to XML file.";
xmlDoc.Save(Server.MapPath("Persons.xml"));
}
}
catch
{
lblStatus.Text = "Sorry, unable to process request. Please try again.";
}
}
再次双击"读取"按钮并编写以下代码以读取数据。
protected void butRead_Click(object sender, EventArgs e)
{
XDocument xmlDoc = XDocument.Load(Server.MapPath("Persons.xml"));
var persons = from person in xmlDoc.Descendants("Person")
select new
{
Name = person.Element("Name").Value,
City = person.Element("City").Value,
Sex = person.Element("Sex").Value,
};
litResults.Text = "";
foreach (var person in persons)
{
litResults.Text = litResults.Text + "Name: " + person.Name + "<br />";
litResults.Text = litResults.Text + "City: " + person.City + "<br />";
litResults.Text = litResults.Text + "Sex: " + person.Sex + "<br /><br />";
}
if (litResults.Text == "")
litResults.Text = "No Results.";
}