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 の特定の部分をロードし、テキスト ファイルをロードして、2 つを比較することになっています。残念ながら、私は 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

要件が正確にわからない。しかし、あなたの質問とコメントに基づくと、あなたは次のような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

文字列変数にファイルの内容を入力するだけの場合は、

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

(「1.txt」で行うのと同じこと)

あなたがいることを確認してください

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

XDocumentまたはXElementのいずれかを使用してファイルをロードし、次のように実行できますLoad

例えば:

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

実行可能ファイルと同じディレクトリからファイルをロードするには、次のことを試してください。

string path = Path.Combine(
    Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]), 
    "1234.xml");

XElement xml = XElement.Load(path);

気になる場合は、このライブラリを使用してハッシュ値を取得できます:https ://github.com/ChuckSavage/XmlLib/ like:

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 に答える