如何使用LINQ或XPath从XML打印值

时间:2015-09-03 12:38:09

标签: c# xml linq xpath

我有点陷入使用XPath或LINQ获取从XML打印的值也是XPath和XML Parsing的新功能, 看看这里的几个例子,但没有任何帮助,因为他们都有不同的属性名称的XML,对于我的情况XML是不同的:

<select name="event" ng-model="data.eventID" ng-options="event as event.name for event in events track by event.eventID">
    <option value="0">--- Please select ---</option>
</select>

它具有相同的属性<select name="event" ng-model="data.eventID" ng-options="event as event.name for event in events track by event.eventID" class="ng-pristine ng-untouched ng-valid"> <option value="?" selected="selected"></option> <option value="2" label="My Event">My Event</option> </select> 但不同的<Entities TotalResult="3"> <Entity Type="test-set-folder"> <Fields> <Field Name="id"> <Value>12457</Value> </Field> <Field Name="parent-id"> <Value>0</Value> </Field> <Field Name="last-modified"> <Value>2015-03-09 14:09:57</Value> </Field> <Field Name="description"> <Value/> </Field> <Field Name="view-order"/> <Field Name="name"> <Value>.NET</Value> </Field> </Fields> </Entity> <Entity Type="test-set-folder"> <Fields> <Field Name="id"> <Value>15487</Value> </Field> <Field Name="parent-id"> <Value>0</Value> </Field> <Field Name="last-modified"> <Value>2015-03-15 13:00:02</Value> </Field> <Field Name="description"> <Value/> </Field> <Field Name="view-order"/> <Field Name="name"> <Value>Python</Value> </Field> </Fields> </Entity> </Entities>

有人可以帮我打印Field属性及其Name

我需要遍历每个实体并打印其Name

到目前为止,我尝试过使用Xpath和LINQ:

Value

但严重的是我不太了解它,所以我的方法完全错了。

我的预期输出是:

Name : Value

和下一个实体相同。

4 个答案:

答案 0 :(得分:2)

由于某些Fields缺少Value元素,您可以尝试这样做:

XElement element = XElement.Load("XmlFile.xml"); 
var query = from field in element.Descendants("Field")
select new
{
    NameAttribute = field.Attribute("Name").Value,
    Value = field.Descendants("Value").Any() ?
    field.Element("Value").Value : "No Value"
};
var namesAndValues = query.ToList()

答案 1 :(得分:1)

您有一个数据透视表,因为您的数据是从两个标记(名称和值)中提取的。这是一种解析xml的方法

Sub GetEAddress()
    Dim c
    Dim Fin As Range
    Dim SearchRangeS1, SearchRangeS2
    Dim i As Integer  '<-- Newly added
    Set SearchRangeS1 = Sheet1.Range("A1:A" & Sheet1.Cells(Rows.Count, 1).End(xlUp).Row)
    Set SearchRangeS2 = Sheet2.Range("A1:A" & Sheet2.Cells(Rows.Count, 1).End(xlUp).Row)
    Sheet3.Cells.Clear
    Sheet3.Range("H1") = "Name"
    Sheet3.Range("I1") = "Email_ID"
    i = Sheet3.Cells(Rows.Count, 1).End(xlUp).Row + 1    '<-- Newly added
    For Each c In SearchRangeS2
        Set Fin = Nothing
        Set Fin = SearchRangeS1.Find(c.Value, LookAt:=xlWhole)
        If Not Fin Is Nothing Then
            With Sheet3.Range("H" & i)  '<-- Changed here
                .Value = c
                .Offset(0, 1).Resize(, 8).Value = c.Offset(0, 1).Resize(, 8).Value
                i = i + 1  '<-- Newly added
            End With
        End If
    Next c
End Sub

答案 2 :(得分:0)

您只需要遵循xml的结构

未经测试的代码:

Mano Negra - Amerika Perdida - 01 - Mano Negra.mp3
Mano Negra - Amerika Perdida - 02 - Mala Vida.mp3
Mano Negra - Amerika Perdida - 03 - Amerika Perdida.mp3
Mano Negra - Amerika Perdida - 04 - Peligro.mp3
[etc...]

答案 3 :(得分:0)

试试这个

var names = from r in document.Descendants("Entities")
                                .Descendants("Entity")
                                    .Descendants("Fields")
                                        .Descendants("Field")
            select new
                {
                    Name = r.Element("name").Value,
                };

foreach (var n in names)
{
    Console.WriteLine(n.Name);
}