-1

プロジェクトでXML読み取りプロセスを実行しています。XMLファイルの内容を読み取る必要がある場所。私はそれを達成しました。

好奇心から、XMLコンテンツを文字列内に保持し、elemetタグ内の値のみを読み取ることで同じものを使用してみました。これでも達成しました。以下は私のコードです。

string xml = <Login-Form>
                 <User-Authentication>
                     <username>Vikneshwar</username>
                     <password>xxx</password>
                 </User-Authentication>

                 <User-Info>
                     <firstname>Vikneshwar</firstname>
                     <lastname>S</lastname>
                     <email>xxx@xxx.com</email>
                 </User-Info>
             </Login-Form>";
        XDocument document = XDocument.Parse(xml);

var block = from file in document.Descendants("client-authentication")
            select new
            {
                Username = file.Element("username").Value,
                Password = file.Element("password").Value,
            };

foreach (var file in block)
{
    Console.WriteLine(file.Username);
    Console.WriteLine(file.Password);
}

同様に、他の要素のセット(名、姓、および電子メール)を取得しました。今、私の好奇心は私を再び引き付けます。今、私は文字列関数を使用して同じことをすることを考えていますか?

上記のコードで使用されているのと同じ文字列が使用されます。XMl関連のクラス、つまりXDocumentXmlReaderなどを使用しないようにしています。文字列関数のみを使用して同じ出力を実現する必要があります。私はそれをすることができません。出来ますか?

4

4 に答える 4

4

しないでください。XMLは、ネスト、文字エスケープ、名前付きエンティティ、名前空間、順序(属性と要素)、コメント、解析されていない文字データ、および空白を取り巻く複雑なルールにより、実際に表示されるよりも複雑です。たとえば、追加するだけです

<!--
    <username>evil</username>
-->

または

<parent xmlns=this:is-not/the/data/you/expected">
    <username>evil</username>
</parent>

または、CDATAセクションでも同じである可能性があります。基本的な文字列ベースのアプローチがどのように機能するかを確認してください。ヒント:DOMを介して得られるものとは異なる答えが得られます。

XMLを読み取るために設計された専用ツールを使用するのが正しいアプローチです。少なくとも、使用XmlReaderしてください-しかし率直に言って、DOM(既存のコードなど)の方がはるかに便利です。または、などのシリアライザーを使用しXmlSerializerてオブジェクトモデルにデータを入力し、それをクエリます。

xmlおよびxmlのようなデータを適切に解析しようとしてもうまくいきません... RegExは、XHTMLの自己完結型タグを除くオープンタグと一致します

于 2012-07-07T07:34:38.880 に答える
2

IndexOf, Equals, Substringクラスで提供されているなどのメソッドを使用Stringして、ニーズを満たすことができます。詳細については、こちらをご覧ください。

正規表現の使用もかなりのオプションです。

ただし、この目的にはXmlDocumentクラスを使用することをお勧めします。

于 2012-07-07T07:21:54.427 に答える
1

これは、次のような正規表現なしで実行できます。

string[] elementNames = new string[]{ "<username>", "<password>"};
foreach (string elementName in elementNames)
{
    int startingIndex = xml.IndexOf(elementName);
    string value = xml.Substring(startingIndex + elementName.Length,
        xml.IndexOf(elementName.Insert(1, "/")) 
        - (startingIndex + elementName.Length));
    Console.WriteLine(value);
}

正規表現を使用する場合:

string[] elementNames2 = new string[]{ "<username>", "<password>"};
foreach (string elementName in elementNames2)
{
    string value = Regex.Match(xml, String.Concat(elementName, "(.*)",
        elementName.Insert(1, "/"))).Groups[1].Value;
    Console.WriteLine(value);
}

もちろん、推奨されるのはXML解析クラスを使用することだけです。

于 2012-07-07T07:26:27.370 に答える
1

次のように、タグ間のテキストを取得する拡張メソッドを作成します。

public static class StringExtension
{
    public static string Between(this string content, string start, string end)
    { 
        int startIndex = content.IndexOf(start) + start.Length;
        int endIndex = content.IndexOf(end);
        string result = content.Substring(startIndex, endIndex - startIndex);
        return result;
    }
}
于 2012-07-07T07:56:03.577 に答える