大家好,我正在尋找解決方案以在 2 個短語之間的字串中查找文本,但例如不是字串中的最后一個,而是首先找到的。在哪里:
mainString = <Message>1</Message><Message>2</Message><Messages>3</Message>
leftBracket = "<Message>"
rightBracket = "</Message>"
因為現在它回傳我1<Message><Message>2<Message><Message>3
但我想回傳值 1
private string between2strings(string mainString, string leftBracket, string rightBracket)
{
int pFrom = mainString.IndexOf(leftBracket) leftBracket.Length;
int pTo = mainString.LastIndexOf(rightBracket);
string result = mainString.Substring(pFrom, pTo - pFrom);
return result;
}
我想在洗掉我的聯系資訊后顯示所有代碼,或者我應該更改讀取資料的方法:
這里是字串中的完整 xml 我正在嘗試查找資料
<?xml version="1.0" encoding="utf-8"?>
<response>
<Count>2</Count>
<Messages>
<Message>
<Smstat>0</Smstat>
<Index>20001</Index>
<Phone> 4857782</Phone>
<Content>Test4</Content>
<Date>2021-12-11 14:24:23</Date>
<Sca> 4879096</Sca>
<SaveType>4</SaveType>
<Priority>0</Priority>
<SmsType>1</SmsType>
</Message>
<Message>
<Smstat>0</Smstat>
<Index>20000</Index>
<Phone> 4857782</Phone>
<Content>Test3</Content>
<Date>2021-12-11 14:02:48</Date>
<Sca> 4879096</Sca>
<SaveType>4</SaveType>
<Priority>0</Priority>
<SmsType>1</SmsType>
</Message>
</Messages>
</response>
uj5u.com熱心網友回復:
我建議您使用XmlDocument物件決議 XML 檔案并使用 XPath 運算式導航其內容。這是一個例子
using System;
using System.Xml;
namespace Test
{
class Program
{
static void Main()
{
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load("Test.xml");
XmlNodeList xmlNodeList = xmlDocument.SelectNodes("/response/Messages/Message");
foreach (XmlNode xmlNode in xmlNodeList)
{
Console.WriteLine(xmlNode.InnerXml);
}
}
}
}
法比奧
uj5u.com熱心網友回復:
使用正則運算式的答案:
var mainString = "<Message>1</Message><Message>2</Message><Message>3</Message>";
string p = "<[^>]*>([^<]*)<[^>]*>";
Regex r = new Regex(p);
foreach (Match item in r.Matches(mainString))
{
Console.WriteLine(item.Groups[1]);
}
}
這將輸出:
1
2
3
正則運算式可以讀作:
<[^>]*>
- 發現 <
-- 后跟不是>0 次或多次的任何字符[^>]*
——接著一個 >
([^<]*)
-- 查找任何字符,而不是<0 次或多次
--()可以參考這個找到的作品。
<[^>]*>
-- 與第一部分相同,找到結束標記。
PS 解釋正則運算式不是我最熱門的主題......??
另見:REGEX101
uj5u.com熱心網友回復:
顯示整個輸入字串之前的舊答案
使用Split(String[], StringSplitOptions):
var mainString = "<Messages>1</Message><Messages>2</Message><Messages>3</Message>";
string[] parts = mainString.Split(new [] { "<Messages>", "</Messages>" },
StringSplitOptions.RemoveEmptyEntries);
這將生成陣列:{ "1", "2", "3" }并使選擇所需條目變得容易:
string result = parts[0];
新答案
您隨后顯示了完整的輸入字串。這使我上面的解決方案過時了。結果是一個完整的 XML 檔案。在這種情況下,我建議使用 XML 序列化來提取資訊。這是從復雜的 XML 字串或檔案中提取資訊的最簡單方法。
我們需要這些用途:
using System.IO;
using System.Xml.Serialization;
讓我們宣告以下表示資料的類:
[XmlRoot("response")]
public class Response
{
public int Count { get; set; }
public List<Message> Messages { get; set; }
}
public class Message
{
public int Smstat { get; set; }
public int Index { get; set; }
public string Phone { get; set; }
public string Content { get; set; }
public DateTime Date { get; set; }
public string Sca { get; set; }
public int SaveType { get; set; }
public int Priority { get; set; }
public int SmsType { get; set; }
}
我們可以從 XML 中提取所有資訊:
const string XmlString =
@"<?xml version=""1.0"" encoding=""utf-8""?>
<response>
...
</response>";
var serializer = new XmlSerializer(typeof(Response), new[] { typeof(Message) });
using var reader = new StringReader(XmlString);
var response = (Response)serializer.Deserialize(reader);
Console.WriteLine(
$"Response count = {response.Count}, Messages count = {response.Messages.Count}");
var m = response.Messages[0];
Console.WriteLine(
$"Index = {m.Index}, Phone = { m.Phone}, Content = {m.Content}, Date = {m.Date}");
產生以下輸出:
回應計數 = 2,訊息計數 = 2
索引 = 20001,電話 = 4857782,內容 = Test4,日期 = 11.12.2021 14:24:23
為此,我必須將 XML 中的日期格式轉換為標準的 XML 日期格式2021-12-11T14:24:23,即T在日期和時間之間使用一個空格而不是一個空格。如果你不想這樣做,你可以用這兩個轉換自定義日期格式的Date屬性替換Message類中的屬性:
[XmlIgnore]
public DateTime Date { get; set; }
[XmlElement("Date")]
public string DateString
{
get => Date.ToString("yyyy-MM-dd HH:mm:ss");
set => Date = DateTime.Parse(value);
}
除了從帶有 a 的字串反序列化之外StringReader,您還可以直接從帶有
var serializer = new XmlSerializer(typeof(Response), new[] { typeof(Message) });
using var fs = new FileStream(filename, FileMode.Open);
var response = (Response)serializer.Deserialize(fs);
概括
只需三行代碼,您就可以從復雜的 XML 中讀取詳細資訊,而無需使用XML 序列化處理 XML 標記和字串索引。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/379716.html
上一篇:xml檔案不讀取字串到xml
