-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 回答