【问题标题】:Get values from xml using regex使用正则表达式从 xml 获取值
【发布时间】:2013-11-27 07:54:01
【问题描述】:

我有以下 xml。

string xmlstring= <z:row ows_Article_x0020_Tags='14;#cricket;#21;#Headlines;#19;#Videos' ows__ModerationStatus='0'      ows__Level='1' ows_Last_x0020_Modified='9;#2013-11-26 01:33:01' ows_ID='9' ows_UniqueId='9;#{FEA534D1-F63B-464D-97DE-     AC60798B72D6}' ows_owshiddenversion='9' ows_FSObjType='9;#0' ows_Created_x0020_Date='9;#2013-11-24 22:59:53'  ows_ProgId='9;#' ows_FileLeafRef='9;#Pablo-Ferrero.aspx' ows_PermMask='0x7fffffffffffffff' ows_Modified='2013-11-26     01:33:01' ows_FileRef='9;#sites/Gaslines/NewsAndEvents/Pages/Pablo-Ferrero.aspx' ows_DocIcon='aspx'     ows_Editor='24;#Harshini P Hegde' />\r\n   
<z:row ows_Article_x0020_Tags='20;#Charity;#14;#cricket' ows__ModerationStatus='0' ows__Level='1'   ows_Last_x0020_Modified='10;#2013-11-26 01:30:11' ows_ID='10' ows_UniqueId='10;#{C8D042AE-466F-44E8-940B-   0C9A64130923}' ows_owshiddenversion='8' ows_FSObjType='10;#0' ows_Created_x0020_Date='10;#2013-11-24 23:01:50'  ows_ProgId='10;#' ows_FileLeafRef='10;#Debra-L-Reed.aspx' ows_PermMask='0x7fffffffffffffff' ows_Modified='2013-11-  26 01:3:10' ows_FileRef='10;#sites/Gaslines/NewsAndEvents/Pages/Debra-L-Reed.aspx' ows_DocIcon='aspx'   ows_Editor='24;#Harshini P Hegde' />\r\n   
<z:row ows_Article_x0020_Tags='' ows__ModerationStatus='3' ows__Level='255' ows_Last_x0020_Modified='13;#2013-11-26     01:45:12' ows_ID='13' ows_UniqueId='13;#{81236BD1-AF3B-4D97-BA14-5492F8013251}' ows_owshiddenversion='5'    ows_FSObjType='13;#0' ows_Created_x0020_Date='13;#2013-11-26 01:28:45' ows_ProgId='13;#'    ows_FileLeafRef='13;#TestTagCloudPage.aspx' ows_PermMask='0x7fffffffffffffff' ows_Modified='2013-11-26 01:45:13'    ows_CheckoutUser='24;#Harshini P Hegde' ows_FileRef='13;#sites/Gaslines/NewsAndEvents/Pages/TestTagCloudPage.aspx'  ows_DocIcon='aspx' ows_Editor='24;#Harshini P Hegde' />\r\n</rs:data>\r\n</xml>"

上面的xml在stringxml之前还有下面的

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'\r\n     xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'\r\n     xmlns:rs='urn:schemas-microsoft-com:rowset'\r\n     xmlns:z='#RowsetSchema'>\r\n
<s:Schema id='RowsetSchema'>\r\n   
<s:ElementType name='row' content='eltOnly' rs:CommandTimeout='30'>\r\n      
<s:AttributeType name='ows_Article_x0020_Tags' rs:name='Article Tags' rs:number='1'>\r\n         

我需要得到输出

  string result= 14;#cricket;#21;#Headlines;#19;#Videos;20;#Charity;#14;#cricket

即我需要介于

之间的 txt
`<z:row ows_Article_x0020_Tags=" and " ows__ModerationStatus=`

我尝试使用 linq 。我做不到。所以我想用正则表达式来做。除了使用正则表达式的结果之外,是否可以删除字符串中的所有其他内容?

【问题讨论】:

  • 我认为正则表达式不是解析 xml 的最佳方式。你有所有的 xml 数据,还是只有这三行?您缺少一些开始标签和命名空间定义
  • 这不是整个 xml。我现在将它们添加。
  • 这仍然是无效的 xml,甚至没有行标签
  • 整个 xml 太大,无法在此处发布。我在这里添加可以吗?
  • 我已经用你的 xml 命名空间更新了我的答案,所以现在这两个选项都可以使用 - 无论是使用 HtmlAgilityPack 还是使用 LINQ to XML(我推荐这个选项)

标签: c# regex string


【解决方案1】:

因此您这里没有有效的 xml,您可以将此字符串视为 html 并使用 HTMLAgilityPack 解析它(可从 NuGet 获得):

HtmlDocument hdoc = new HtmlDocument();
hdoc.LoadHtml(xmlstring);
var tags = hdoc.DocumentNode.Descendants()
               .Select(r => r.GetAttributeValue("ows_Article_x0020_Tags", ""));

string result = String.Join("", tags);
// 14;#cricket;#21;#Headlines;#19;#Videos20;#Charity;#14;#cricket

使用有效 xml 的推荐解析工具是 LINQ to XML。解析应该是这样的:

XDocument xdoc = XDocument.Parse(validXmlString);
XNamespace z = "#RowsetSchema";
var tags = xdoc.Descendants(z + "row")
               .Select(r => (string)r.Attribute("ows_Article_x0020_Tags"));

【讨论】:

  • 标签为空.. entie xml 输出可在此处获得..pastebin.com/9K8GRZg0
  • 尝试运行 .Replace() 来删除文字 \r\n 字符 (validXMLString.Replace("\\r\\n", ""))
  • @Jinxed 与您的 xml 一起工作得很好,如果您要从中删除 \r\n 字符串(我相信您有它是因为从调试器复制粘贴)。你也有ItemCount=\"8\"转义引号
  • 我真的不知道发生了什么。但它奏效了。非常感谢.. :) 非常感谢你..
【解决方案2】:

我不能强调使用正则表达式从 xml 中提取值的想法是多么糟糕,但如果你真的想这样做应该可以:

        Regex regex = new Regex("ows_Article_x0020_Tags='([^']*)'");
        var matches = regex.Matches(xmlstring);
        Console.WriteLine(matches[0].Groups[1].Value);
        Console.WriteLine(matches[1].Groups[1].Value);

【讨论】:

  • 感谢您提供这段代码。是否可以通过仅保留值来从字符串中删除其他所有内容以避免循环。??
【解决方案3】:

我通常使用 LINQ 从 XML 中获取值,这使它变得非常容易。

示例 1:LINQ to read XML

示例 2:我使用下面的方法获取测验应用程序的问题和答案列表

    public List<QuizQuestions> GetQuiz(int level)
    {
        string docName = "DataModel/Level" + level.ToString() + ".xml";
        XDocument xdoc = XDocument.Load(docName); 
        List<QuizQuestions> book = (from list in xdoc.Descendants("Question")
                                    select new QuizQuestions(list.Element("Quest").Value
                                                             , list.Element("A").Value
                                                             , list.Element("B").Value
                                                             , list.Element("C").Value
                                                             , list.Element("D").Value
                                                             , list.Element("Answer").Value)
                                                             ).OrderBy(a => Guid.NewGuid()).ToList();
        return book;
    }

更新:这仅适用于有效的 XML

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多