使变量从 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 C# 读取

不完全确定您的要求是什么;但是根据您的问题和评论,看起来您有一个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.";
    }