2016-04-22 7 views
2

"<>"の間にないテキストファイルからテキストを抽出しようとしました。同時に、私は抽出された単語を新しい行に印刷したい。"<>"の間にテキストを抽出する方法

これは質問です:Write a program that extracts from an XML file the text only (without the tags)

サンプル入力: <?xml version="1.0"><student><name>Peter</name><age>21</age><interests count="3"><interest>Games</interest><interest>C#</interest>

所望の出力:

Peter 21 Games C# Java

私の現在の入力は、このようなものです:

Peter 

21 


Games 

C# 

Java 

間に空白行があります。

これは私のコードが現時点でどのように見えるかです。どんな助けもありがとう! あなたが不思議に思っていたならば、これは自己学習宿題です。だから私はこれを手にする必要はありません。私は不正行為ではありません。

using System; 
    using System.Collections.Generic; 
    using System.IO; 
    using System.Text; 

    namespace Chapter_15_Question_10 
    { 
     class Program 
     { 
    static void Main(string[] args) 
    { 
     Console.WriteLine("This app extracts the words not in tags"); 

     StreamReader reader = new StreamReader(
      @"C:\Users\Nate\Documents\Visual Studio 2015\Projects\Chapter 15\Chapter 15 Question 10\Chapter 15 Question 10\TextFile1.txt"); 

     StringBuilder sb = new StringBuilder(); 

     using (reader) 
     { 
      string line = reader.ReadToEnd(); 
      bool isOpen = false; 
      for (int i = 1; i < line.Length; i++) 
      { 

       if (line[i-1] == '<') 
       { 
        isOpen = true; 
       } 

       if (line[i-1] == '>') 
       { 
        isOpen = false; 
       } 

       if (isOpen) 
       { 
        continue; 
       } 

       if (!(isOpen) && (line[i] != '<')) 
        Console.Write(line[i]); 
       if(line[i] == '<') 
        Console.WriteLine(); 
      } 
     } 
    } 
} 

}

+12

EVERY時間を引き起こすだろう
シーケンスを、それをトレースするための努力を取る場合人生はもっと楽になり、宿題のように見えるので、残りの部分は自分でやってください:) –

+2

AD.Netの説明を続けると、役に立つMSDN記事があります:[XML処理オプション](https://msdn.microsoft .com/ja-us/library/bb669131(v = vs.110).aspx) –

+0

このソリューションでは、XMLを手動で解析する必要がありますか、または既存のツールを使用できますか? – SpaceghostAli

答えて

1

行ずつ読み、区切り文字を解析することによってXMLを自分で解析しようとしないでください。 .NETには、XMLを読むためのさまざまなクラスが用意されています。

あなたが探しているものは、テキストノードです。あなたはLINQのは、あなたのXMLを読み取るために、クエリを使用し風味このXML

var xml = "<?xml version=\"1.0\"?><student><name>Peter</name><age>21</age><interests count=\"3\"><interest>Games</interest><interest>C#</interest></interests></student>"; 

このバージョンは、より新しいSystem.Xml.Linq名前空間を使用し、仮定し

var doc = XDocument.Parse(xml); // Use XDocument.Load instead of parse to read from a file 
foreach (var text in doc.DescendantNodes().Where(n => n.NodeType == System.Xml.XmlNodeType.Text)) 
{ 
    Console.WriteLine(text); 
} 

このバージョンでは、クエリを記述するためにXPathを使用することができますSystem.Xml名前空間を使用していますが。

var doc = new XmlDocument(); 
doc.LoadXml(xml); // Use doc.Load to read from a file 
foreach (XmlNode text in doc.SelectNodes("//text()")) 
{ 
    Console.WriteLine(text.Value); 
} 
+0

私はまだLinqがXML自体にさらされていることを学ぶために持っているので、私はこのメソッドを使用している唯一の理由です。この宿題は、テキストファイルの取り扱いに関する章にありました。私はそれをより明確にすべきだった!私の悪い。 Hehe – Nate

+0

XmlDocumentを使用する2番目のバージョンはLinqを使用しませんが、元のXmlDocumentを使用します。あなたの宿題で、Xmlクラスをまったく使用すべきでないと指定した場合、これは他のものです。 –

0

私は.NET XMLクラスのいずれかを使用する必要がありますが、これは宿題であり、あなたの先生があなたにしたくないと思います。だからここにあなたのコードが変更され、次のとおりです。

for (int i = 0; i < line.Length; i++) { 
    if (line[i] == '<') { 
     isOpen = true; 
    } 
    else if (line[i] == '>') { 
     isOpen = false; 
    } 
    else if (!isOpen) { 
     Console.Write(line[i]); 
     if (i < line.length - 1 && '<' == line[i+1]) { 
      Console.WriteLine(); 
     } 
    } 
} 
+0

line [i + 1]は、範囲外のインデックスを与えることができます – Paparazzi

+0

@パパラッチはい、私はそれを考えましたが、xmlの書式はよく、終了タグで終わると仮定しました。しかし、私は修正します。このコードはあまり堅牢ではなく、 "現実の世界"で使用すべきではありませんが、宿題なので、質問に与えられた内容に対処しました。 –

0

これは、正規表現のための完全な使用である:

using System; 
using System.Text.RegularExpressions; 

namespace RegexTest 
{ 
    class Program 
    { 
     static void Main(string[] args) { 
      string pattern = @"(?<=>)[^<]+(?=<)"; 
      Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase); 
      string example = @"<?xml version=""1.0""><student><name>Peter</name><age>21</age><interests count=""3""><interest>Games</interest><interest>C#</interest>"; 
      MatchCollection results = rgx.Matches(example); 
      foreach (Match m in results) 
      { 
       Console.WriteLine(m.Value); 
      } 
     } 
    } 
} 

結果:

Peter 
21 
Games 
C# 

それは><の間で任意のテキストを返します。少なくとも1つの文字がある限り。

0

私は数年前と同じ宿題を解決しました。だから、私の以前の解決策は今のところよく見えません。アイデアは、私は、文字列操作の多くの使用に次のアプローチを提案することができ、「手動」のテキスト解析を行使することであるとして:

 using (reader) 
     { 
      var text = reader.ReadToEnd(); 

      // Text is found between > and < tags 
      for (int i = 0; i < text.Length - 1; i++) 
      { 
       // Find first and last index of the substring to be extracted 
       if (text[i] == '>' && text[i + 1] != '<') 
       { 
        int textFirstIndex = i + 1; 

        // Handle border case 
        if (textFirstIndex == text.Length - 1) 
        { 
         sb.Append(text.Substring(textFirstIndex, 1)); 
         break; 
        } 

        int textLastIndex = text.IndexOf('<', textFirstIndex + 1); 

        // Extract substring 
        sb.AppendLine(text.Substring(textFirstIndex, textLastIndex - textFirstIndex)); 
        i = textLastIndex; 
       } 
      } 
     } 

     Console.WriteLine(sb.ToString().TrimEnd()); 

私はこれが最適な解決策ではないことを強調し、それがこのような教育目的のために適切です。

0

あなたは

>< 

はあなたになるだろう、改行にあなたは `のxml deserialization`を行うことができます

bool writeON = false; 
StringBuilder sb = new StringBuilder(); 
foreach (char c in line) 
{ 
    if (c == '>') 
     writeON = true; 
    else if (c == '<') 
    { 
     writeON = false; 
     if (sb.Length > 0) 
      Debug.WriteLine(sb.ToString()); 
     sb.Clear(); 
    } 
    else if (writeON) 
     sb.Append(c); 
} 
Debug.WriteLine("ddonce"); 
関連する問題