1

私は私のC#勝利フォームにこのサンプルコードを持っています...

List<string> listFurniture = new List<string>();
XDocument xml = XDocument.Load(Application.StartupPath + @"\Furniture.xml");
foreach (XElement quality in xml.Descendants("Quality"))
    listFurniture.Add(quality.Value);

maintextbox.Text = listFurniture[0];

...そしてこの例のxml

<Furniture>
  <Table>
    <Quality>textbox1.Text + "and" + textbox2.Text + "but" + textbox3.Text</Quality>   
    ...
  </Table>  
</Furniture>

私のジレンマは、maintextbox がtextbox1.Texttextbox1 の値ではなく、実際の文字列 " " を生成していることです。

xml 値を次のように読み取ります。

maintextbox.Text = textbox1.Text + "and" + textbox2.Text + "but" + textbox3.Text;

ではない:

maintextbox.Text = "textbox1.Text + "and" + textbox2.Text + "but" + textbox3.Text";

テキストファイルも使用してStreamReaderみましたが、同じ結果が得られました。

プロジェクトをこのようにコーディングする理由は、テキスト ボックスの順序が変更され、「and」と「but」も変更されるためです。その変更が発生した場合、コードを書き直してプログラムを再コンパイルする必要はありません。xml に変更を加えるだけです。

4

2 に答える 2

2

ソリューションの xml 解析はすべて問題ありません。必要なのはQuality文字列の処理です。

string[] parts = quality.Split('+');
Regex regex = new Regex(@"^""(.*)""$");
var textBoxes = Controls.OfType<TextBox>().ToList();

for (int i = 0; i < parts.Length; i++)
{
    string part = parts[i].Trim();

    var match = regex.Match(part);
    if (match.Success)
    {
        parts[i] = match.Groups[1].Value;
        continue;
    }

    var textBox = textBoxes.FirstOrDefault(tb => tb.Name + ".Text" == part);
    if (textBox != null) // possibly its an error if textbox not found
        parts[i] = textBox.Text; 
}    

mainTextBox.Text = String.Join(" ", parts);

ここで何が起こったのですか:

  • 高品質の文字列を文字で分割+して、文字列部分の配列を取得します
  • 正規表現を使用して、部分が引用符で囲まれたものに見えるかどうかを確認します"something"。はいの場合、それはorandまたは他の接続語になります
  • そして最後に、品質文字列部分のテキストボックスの名前に一致するすべてのテキストボックスをチェックします。一致する場合は、一部をテキストボックスのテキストに置き換えます
  • パーツを結合して結果文字列を取得します

ところで、Xml を 1 行で解析できます。

var listFurniture = xml.Descendants("Quality") 
                       .Select(q => (string)q)
                       .ToList();
于 2013-01-18T07:18:29.960 に答える
1

アップデート:

コードを少し説明するコメントを受け取ったので、少し説明します。

まず、言語としての XML は構造化のために設計されています。その構造と使いやすさ。言語間またはアプリケーション間でシームレスにデータを迅速に解析するための柔軟性と能力を提供します。元の質問では、テキストボックスがコードの文字列値を生成していると述べていますtextbox.text

XML は構造化する必要があります。構造の例は次のとおりです。

<Furniture>
     <Table>
         <Color> Red </Color>
         <Quality> 10 </Quality>
         <Material> Wood </Material>
      </Table>
</Furniture>

したがって、XML を読み取る場合は、rootタグを見つけることになります。他のすべてのコンポーネントはnodes. これらのノードは、テキストボックスに表示したい適切な相関関係を得るために、インデックスを作成するか、吸い上げる必要があります。

それがこのコードが行っていることです。ステップごとに分解していきます。

// String you will format with the XML Structure.
StringBuilder output = new StringBuilder();

次の部分は次のようになります。

// Create an XML Reader, by wrapping it in the 'using' it will ensure once your done the object is disposed of.  Rather then leaving the connection to your document open.
using (XmlReader reader = XmlReader.Create(new StringReader(xmlString)))
{
       // We will read our document to the following; hold to that attribute.  The attribute is identifying the node and all of the child elements that reside within it: So in our case Table.
       reader.ReadToFollowing("Table");
       reader.MoveToFirstAttribute();
       string color = reader.Value;
       output.AppendLine("The color of the table " + color);

       // As you can see there isn't anything fancy here, it reads to our root node.  Then moves to the first child element.  Then it creates a string and appends it. Keep in mind we are using our StringBuilder so we are just appending to that structure.
       reader.ReadToFollowing("Material");
       output.AppendLine("The material: " + reader.ReadElementContentAsString());

       // Same result as we used earlier; just a different method to attain our value.
}

// Now we output our block.
OutputTextBlock.Text = output.ToString();

これで、すべてのデータが文字列にプッシュされます。明らかに、上記のコードをテキストボックスで使用して、これらの値も取得できます。

これが、アプリケーションで XML を正しく受け取る方法です。しかし、あなたは前に2つのことを述べました。したがって、テキストボックスを使用してドキュメントに物理的に書き込もうとしているように思えますが、これは XmlWriter を介して行うことができます。

ただし、テキストボックスに関する限りtextbox.text、値に関連付けられているため、テキストボックスを受け取り続ける理由もあります。あなたの構造は、この文字列が値であることを示しています。

あなたの目標を達成するために; 値をドキュメントに書き込むメソッドがあります。それから別の人がそれを読みます。ドキュメントの内外でデータを適切に移行し、正しく表現されるようにします。

<Quality>Textbox1.Text</Quality> これにより、テキストボックスの値がドキュメントとテキストボックスに自動的に読み込まれなくなります。ノードに文字列値を割り当てます。ドキュメントを読み取る前に、ドキュメントに値を物理的に書き込む必要があります。

MSDN には、データを適切に解析する方法の例があります。うまくいけば、問題が発生している理由のいくつかが明らかになりました。


より多くのコード; MSDN から直接: MSDN から直接:

StringBuilder output = new StringBuilder();

String xmlString =
        @"<?xml version='1.0'?>
        <!-- This is a sample XML document -->
        <Items>
          <Item>test with a child element <more/> stuff</Item>
        </Items>";
// Create an XmlReader
using (XmlReader reader = XmlReader.Create(new StringReader(xmlString)))
{
    XmlWriterSettings ws = new XmlWriterSettings();
    ws.Indent = true;
    using (XmlWriter writer = XmlWriter.Create(output, ws))
    {

        // Parse the file and display each of the nodes.
        while (reader.Read())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    writer.WriteStartElement(reader.Name);
                    break;
                case XmlNodeType.Text:
                    writer.WriteString(reader.Value);
                    break;
                case XmlNodeType.XmlDeclaration:
                case XmlNodeType.ProcessingInstruction:
                    writer.WriteProcessingInstruction(reader.Name, reader.Value);
                    break;
                case XmlNodeType.Comment:
                    writer.WriteComment(reader.Value);
                    break;
                case XmlNodeType.EndElement:
                    writer.WriteFullEndElement();
                    break;
            }
        }

    }
}
OutputTextBlock.Text = output.ToString();

また

StringBuilder output = new StringBuilder();

String xmlString =
    @"<bookstore>
        <book genre='autobiography' publicationdate='1981-03-22' ISBN='1-861003-11-0'>
            <title>The Autobiography of Benjamin Franklin</title>
            <author>
                <first-name>Benjamin</first-name>
                <last-name>Franklin</last-name>
            </author>
            <price>8.99</price>
        </book>
    </bookstore>";

// Create an XmlReader
using (XmlReader reader = XmlReader.Create(new StringReader(xmlString)))
{
    reader.ReadToFollowing("book");
    reader.MoveToFirstAttribute();
    string genre = reader.Value;
    output.AppendLine("The genre value: " + genre);

    reader.ReadToFollowing("title");
    output.AppendLine("Content of the title element: " + reader.ReadElementContentAsString());
}

OutputTextBlock.Text = output.ToString();
于 2013-01-18T00:08:17.540 に答える