【问题标题】:Separating a line of code to find a specific part分隔一行代码以查找特定部分
【发布时间】:2014-09-11 02:35:35
【问题描述】:

我有一个看起来像这样的代码块(来自 XIB 文件)

<tabBar contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ZTF-8n-Y8A">
    <rect key="frame" x="2" y="431" width="320" height="49"/>
    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
    <items>
          <tabBarItem title="Item" id="vcz-nP-1al"/>
          <tabBarItem title="Item" id="9mv-O2-GXB"/>
    </items>
</tabBar>

我通过使用以下搜索 id 找到了该块的第一行

foreach(var search in Outlets.Values)
{
    var ui = new UIObject();
    var fullSearch = string.Format("id=\"{0}\"", search);
    using (var reader = File.OpenText(infile))
    {
         var line = await reader.ReadLineAsync();
         if (line.Contains(fullSearch))

Outlets 是字典

我可以抓取正在读取的文件中的整个内容并将其存储在一个字符串中,或​​者更有可能是一个字符串构建器对象。

我想要做的是搜索块的关键部分——例如,width="320"。我需要将 width="320" 与字符串的其余部分分开,然后删除 320 部分。

我确实考虑过使用 IndexOf("width") 然后数 6 以到达引号内部直到下一个引号,但这可能相当低效 - 特别是如果字符串很长。

有没有办法按照我描述的方式获取字符串的一部分?

【问题讨论】:

标签: c#


【解决方案1】:

您可以尝试将其解析为 XML。例如获取宽度值:

string str = @"<tabBar contentMode=""scaleToFill"" translatesAutoresizingMaskIntoConstraints=""NO"" id=""ZTF-8n-Y8A"">
    <rect key=""frame"" x=""2"" y=""431"" width=""320"" height=""49""/>
    <autoresizingMask key=""autoresizingMask"" widthSizable=""YES"" flexibleMinY=""YES""/>
    <color key=""backgroundColor"" white=""0.0"" alpha=""0.0"" colorSpace=""calibratedWhite""/>
    <items>
          <tabBarItem title=""Item"" id=""vcz-nP-1al""/>
          <tabBarItem title=""Item"" id=""9mv-O2-GXB""/>
    </items>
</tabBar>";

 XDocument xdoc = XDocument.Parse(str);
 string width = xdoc.Root.Element("rect").Attribute("width").Value;

【讨论】:

    【解决方案2】:

    你可以试试这个代码示例。

    var xml = XDocument.Load("in.xml");
    
    if (xml.Root != null)
    {
        var elements = xml.Root.XPathSelectElements("//*[@width]");
        foreach (var element in elements)
        {
            element.Attribute("width").Remove();
        }
    }
    
    xml.Save("out.xml");
    

    首先我们读取 XML 文件并将其解析为 XDocument (XDocument.Load)。 然后使用XPath (xml.Root.PathSelectElements) 我们选择所有具有width 属性的元素(这就是XPath //*[@width] 的含义)。 之后我们简单地遍历找到的元素并删除属性width。 此代码示例将删除所有 width 属性,如果您只需要删除特定标记或特定值的属性,则应修改 XPath。

    如果您只需要删除一个特定元素的属性(例如标签rect),则可以使用

    root.Element("rect".Attribute("width").Remove();
    

    而不是 XPath 和 foreach 循环

    【讨论】:

      猜你喜欢
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 2015-12-28
      相关资源
      最近更新 更多