c# - C#中的正则表达式条件问题

标签 c# xml regex xpath xml-parsing

我有一些内容嵌套在 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>

我必须单独捕获详细信息(如果它们在那里),否则我需要在循环遍历 matchcollection 时在我的程序中的字符串中将这些值设置为空,因此我的代码需要将 strDetail1 和 strDetail2 设置为“”或值“第一个细节”和“第二个细节”(如果有意义的话)。

最佳答案

我建议使用 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();

关于c# - C#中的正则表达式条件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6313999/

相关文章:

c# - 将列表绑定(bind)到 gridview C#

c# - 使用 DataSet 表创建 xml

javascript - react : Invalid prop type Link when using JSX

regex - 这个 perl 正则表达式有什么问题?

python - 如果是分号,则匹配除最后一个字符之外的所有字符

c# - 在 C# .cs 文件中放置 using 语句的位置

c# - 如何在 RavenDB 中的对象集合中搜索 "Not Contains"条件

c# - 如何判断两个泛型类型值是否相等?

java - 通过 xml 文件搜索文本的最佳方法

java - 如何创建正则表达式来匹配Java中的单词结尾?