分隔一行代码以查找特定的部分

本文关键字:查找 代码 一行 分隔 | 更新日期: 2023-09-27 18:21:31

我有一个代码块,看起来像这样(它来自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,直到下一个引号,但这可能效率很低,尤其是当字符串很长的时候。

有没有一种方法可以按照我描述的方式提取字符串的一部分?

分隔一行代码以查找特定的部分

您可以尝试将其解析为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;

您可以尝试这个代码示例。

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循环