【问题标题】:regular expression conditional problems in C#C#中的正则表达式条件问题
【发布时间】:2011-09-12 22:16:43
【问题描述】:

我有一些内容嵌套在 span 标签中。其中一些有我需要提取的细节,而另一些则没有。我不知道如何检查两个选项并提取正确的数据。这些组重复。例如:

<span name="foo">
    <span name="bar">
        Missing Data
    </span>
</span>
<span name="foo">
    <span name="bar">
        <span name="detail1">first detail</span>
        <span name="detail2">second detail</span>
    </span>
</span>

如果它们存在,我必须单独捕获详细信息,否则我需要在循环匹配集合时在程序中的字符串中将这些值设置为 null,因此我的代码需要将 strDetail1 和 strDetail2 设置为 "" 或值“第一个细节”和“第二个细节”如果有意义的话。

【问题讨论】:

    标签: c# xml regex xpath xml-parsing


    【解决方案1】:

    我建议使用 XPath 来解析值。对于解析 xml 结构,这将比 Regex 更可靠。

    var xml = @"
        <root>
        <span name=""foo"">
            <span name=""bar"">
                Missing Data
            </span>
        </span>
        <span name=""foo"">
            <span name=""bar"">
                <span name=""detail1"">first detail</span>
                <span name=""detail2"">second detail</span>
            </span>
        </span>
        </root>
    ";
    
    var document = XDocument.Parse(xml);
    var details = document.XPathSelectElements("//span[@name='foo']/span[@name='bar']/span[starts-with(@name,'detail')]")
        .Select(arg => arg.Value)
        .ToList();
    

    或 LINQ-to-XML

    var details = document
        .Descendants("span").Where(arg => arg.Attribute("name").Value == "foo")
        .Elements("span").Where(arg => arg.Attribute("name").Value == "bar")
        .Elements("span").Where(arg => arg.Attribute("name").Value.StartsWith("detail"))
        .Select(arg => arg.Value)
        .ToList();
    

    [编辑]我可能误解了这个问题。似乎您还想替换或填充一些值。只要您有XDocument,就可以通过上述方法做到这一点。例如,此代码将清除 detail1detail2 元素的值:

    var detailNodes = document.XPathSelectElements("//span[@name='foo']/span[@name='bar']/span[starts-with(@name,'detail')]")
        .ToList();
    
    detailNodes[0].Value = string.Empty;
    detailNodes[1].Value = string.Empty;
    
    var newXml = document.ToString();
    

    [编辑]

    如何添加元素:

    var elementsWithMissingDetals = document
        .XPathSelectElements("//span[@name='foo']/span[@name='bar' and count(*)=0]")
        .ToList();
    
    foreach (var elementsWithMissingDetal in elementsWithMissingDetals)
    {
        elementsWithMissingDetal.Add(
            new XElement("span", "first detail", new XAttribute("name", "detail1")));
        elementsWithMissingDetal.Add(
            new XElement("span", "second detail", new XAttribute("name", "detail2")));
    }
    
    var newXml = document.ToString();
    

    【讨论】:

    • +1 - 示例代码并没有解决他的整个问题(试图在循环中获取所有这些值),但这个示例将 OP 指向正确的方向。对 XML 使用 XML 工具,仅对自定义文本使用正则表达式,因为您还没有围绕它构建的标准格式。
    • @Merlyn Morgan-Graham - 错字。感谢您指出这一点。
    • 有趣。我很喜欢这是如何发展的。 @Merlyn Morgan-Graham 是对的,但还没有完全回答。我如何解释其中有“丢失数据”的第一个。我需要使用空白值创建该详细信息。我一直在追逐这个正则表达式很远的兔子洞。这是一个放大的简化示例。我正在循环重复记录,提取各种位,我想我可以将它们从正则表达式转换为 linq-to-xml 就好了,但我不知道当我遇到那些没有详细信息的奇怪的时该怎么办.
    • @Twisted - 您同样可以循环遍历 XML 元素,并在需要时更新它们。稍后将添加添加元素的示例。
    • 看到了您的最新编辑。是的,我需要填写一些值。如果它不存在,你能告诉我如何填充它吗?
    猜你喜欢
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    相关资源
    最近更新 更多