0

根据我之前的一些问题,我整理了以下内容:

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>
4

5 回答 5

0

如果您只想使用文件内容填充字符串变量,请尝试

var xml = File.ReadAllText("1234.xml");

(与“1.txt”相同)

确保你是

using System.IO;
于 2012-05-21T22:26:38.850 回答
0

您可以使用 XDocument 或 XElement 加载文件并Load对其进行 ing:

例如:

XDocument doc = XDocument.Load("1234.xml");
于 2012-05-21T22:26:58.663 回答
0

不完全确定您的要求是什么;但根据您的问题和评论,您似乎有一个 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>
于 2012-05-22T00:09:34.997 回答
0

要从与可执行文件相同的目录加载文件,请尝试以下操作:

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[*]意味着具有任何子节点的后代数据节点,您在方程式中拥有这些节点。

但是,如果您知道您的数据将位于 Data/Info 节点中(仍在使用该库):

string info = xml.Get("Data/Info", string.Empty);
于 2012-05-22T02:44:13.920 回答
0

试试下面的代码.......

您必须使用名为 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.";
    } 
于 2013-04-25T05:39:58.603 回答