如何通过带前缀的属性查找XML元素

本文关键字:查找 XML 元素 属性 何通过 前缀 | 更新日期: 2023-09-27 17:59:04

我有以下XML:

<r xmlns:p="p" xmlns:s="s" p:p="1">
    <d id="{FE5D7FDF-89C0-4D99-9AA3-B5FBD009C9F3}">
        <r uid="{B19D0460-69C9-4FEC-A882-41FFA77B582F}" p:before="r[@uid='{D43901A0-1B71-4C65-BEED-DDCF28FCE5A5}']" s:ds="/Polecane" s:id="{C3AC52FB-8F51-4B44-A3EE-55F4C2EAF83F}" s:par="" s:ph="moviesplaceholder" />
        <r uid="{D43901A0-1B71-4C65-BEED-DDCF28FCE5A5}" p:before="r[@uid='{4D8EE7B4-E1D2-4CBF-AED7-5E969EFAA57A}']" s:ds="/HITY" s:id="{7A80D822-8D6A-40C4-92D4-2FA22C596339}" s:par="" s:ph="moviesplaceholder" />
        <r uid="{4D8EE7B4-E1D2-4CBF-AED7-5E969EFAA57A}" p:before="r[@uid='{B6036949-B723-42CE-9271-64DF299450DC}']" s:ds="/VOD" s:id="{557800E7-953B-4830-8691-3FFB964712A8}" s:par="" s:ph="moviesplaceholder" />
    </d>
</r>

我把它存储在String变量中。我能找到带有的节点吗

s:ds="/Polecane"

然后获取其"uid"并将其设置在HITY节点中的"p:before"中?

如何通过带前缀的属性查找XML元素

使用XDocument:

string xml = @"<r xmlns:p=""p"" xmlns:s=""s"" p:p=""1"">
    <d id=""{FE5D7FDF-89C0-4D99-9AA3-B5FBD009C9F3}"">
        <r uid=""{B19D0460-69C9-4FEC-A882-41FFA77B582F}"" p:before=""r[@uid='{D43901A0-1B71-4C65-BEED-DDCF28FCE5A5}']"" s:ds=""/Polecane"" s:id=""{C3AC52FB-8F51-4B44-A3EE-55F4C2EAF83F}"" s:par="""" s:ph=""moviesplaceholder"" />
        <r uid=""{D43901A0-1B71-4C65-BEED-DDCF28FCE5A5}"" p:before=""r[@uid='{4D8EE7B4-E1D2-4CBF-AED7-5E969EFAA57A}']"" s:ds=""/HITY"" s:id=""{7A80D822-8D6A-40C4-92D4-2FA22C596339}"" s:par="""" s:ph=""moviesplaceholder"" />
        <r uid=""{4D8EE7B4-E1D2-4CBF-AED7-5E969EFAA57A}"" p:before=""r[@uid='{B6036949-B723-42CE-9271-64DF299450DC}']"" s:ds=""/VOD"" s:id=""{557800E7-953B-4830-8691-3FFB964712A8}"" s:par="""" s:ph=""moviesplaceholder"" />
    </d>
</r>";
XNamespace nsS = "s";
XNamespace nsP = "p";
XDocument xd = XDocument.Parse(xml);
XElement elPolecane = xd.Descendants("r").Where(e => (e.Attribute(nsS + "ds") != null) && e.Attribute(nsS + "ds").Value == "/Polecane").FirstOrDefault();
if (elPolecane != null)
{
    string uid = elPolecane.Attribute("uid").Value;
    XElement elHITY = xd.Descendants("r").Where(e => (e.Attribute(nsS + "ds") != null) && e.Attribute(nsS + "ds").Value == "HITY").FirstOrDefault();
    if (elHITY != null)
    {
        elHITY.Attribute(nsP + "before").SetValue("r[@uid='" + uid + "']");
    }
}
Console.WriteLine(xd.ToString());
Console.ReadLine();

您可以使用这样的东西:

  //variable which holds xml data
  string xml = "<r>......</r>";
  XmlDocument doc = new XmlDocument();
  //XML in XmlDocument
  doc.LoadXml(xml);
  XmlNodeList nodes = doc.SelectNodes("//d/r");
  string uid = "";
  //Parse all r nodes
  foreach (XmlNode node in nodes)
  {
    if (node.Attributes["s:ds"].InnerText == "/Polecane")
    {
      uid = node.Attributes["uid"].InnerText;
    }
  }
  foreach (XmlNode node in nodes)
  {
    if (node.Attributes["s:ds"].InnerText == "/HITY")
    {
      //Update attribute
      node.Attributes["p:before"].InnerText = uid;
    }
  }
  doc.Save(@"C:'tmp'xmldocument.xml");