Löschen XElement basierend auf Attribut
-
05-07-2019 - |
Frage
Ich spiele immer noch mit xml um. Jetzt habe ich eine Datei, die wie folgt aussieht:
<?xml version="1.0" encoding="utf-8"?>
<Attributes>
<AttributeSet id="10110">
<Attribute id="1">some text here</Attribute>
<Attribute id="2">some text here</Attribute>
<!-- 298 more Attribute nodes follow -->
<!-- note that the value for the id attribute is numbered consecutively -->
</AttributeSet>
</Attributes>
Es gibt 300 Attributknoten insgesamt, von denen die meisten brauche ich nicht. Was ich möchte, zu tun ist, alle Attribute Knoten zu entfernen, die nicht einen bestimmten Wert für das id-Attribut haben. Ich habe ein String-Array mit etwa 10-Werte festgelegt. Diese Werte stellen die Attribute, die Ich mag würde im xml zu halten. Der Rest Ich möchte entfernen.
Was ich versuche unten mit dem Code zu tun, ist die XML ändern, indem alle Attribute Knoten zu entfernen, die ich will nicht verwenden:
Dim ss() As String = New String() {"39", "41", "38", "111", "148", "222", "256", "270", "283", "284"} 'keep the Attributes whose id value is one of these numbers
Dim rv As New List(Of String)'will hold Attribute ids to remove
Dim bool As Boolean = False
For Each x As XElement In doc...<eb:Attribute>
For Each s As String In ss
If x.@id = s Then
bool = True
Exit For
End If
Next
If bool = True Then
'do nothing
Else 'no attribute matched any of the attribute ids listed mark xelement for removal
rv.Add(x.@id)
End If
Next
'now remove the xelement
For Each tr As String In rv
Dim h As String = tr
doc...<eb:Attribute>.Where(Function(g) g.@id = h).Remove()
Next
'save the xml
doc.Save("C:\myXMLFile.xml")
Aus irgendeinem Grund mein Code funktioniert nicht. Keiner der unerwünschten Attribute Knoten entfernt werden.
Was ist das Problem? Wie kann ich die Attributknoten, deren id-Attribut Werte entfernen keine Nummer in meinem String-Array übereinstimmen?
Vielen Dank im Voraus.
P. S. - Ich hoffe, dass ich mich klar mein Problem bei der Beschreibung
.Lösung
Es macht nichts. Ich habe es herausgefunden. Hier ist, was ich getan habe:
For Each x As XElement In doc...<eb:Attribute>
**bool = False 'I simply added this line of code and everything worked perfectly**
For Each s As String In ss
If x.@id = s Then
bool = True
Exit For
End If
Next
If bool = True Then
'do nothing
Else 'no attribute matched any of the attribute ids listed so remove the xelement
rv.Add(x.@id)
End If
Next
Andere Tipps
Entfernen Sie alle unerwünschten Knoten:
XDocument xDoc = XDocument.Load(xmlFilename);
List<string> keepList = new List<string> { "1", "2", "3" };
var unwanted = from element in xDoc.Elements("Attributes").Elements("AttributeSet").Elements("Attribute")
where !keepList.Contains((string)element.Attribute("id"))
select element;
unwanted.Remove();
xDoc.Save(xmlFilename);