Xml: лучшая практика для создания x-path с параметрами - PullRequest
1 голос
/ 02 декабря 2010

Как лучше всего создавать x-path с параметрами?

Я должен выбрать узел XML, где атрибут имеет точное значение, например:

XmlNode node = parentNode.SelectSingleNode(
  string.Format("./field1/field2[@attributeName='{0}']", valueRequired));

Ответы [ 4 ]

2 голосов
/ 02 декабря 2010

Это зависит от того, будет ли когда-либо valueRequired иметь неприятное значение, такое как '. Но для простых значений это должно работать хорошо.

В остальном, LINQ-to-XML довольно хорош:

// where parentNode is XElement
var node = (from el in parentNode.Elements("field1").Elements("field2")
            where (string) el.Attribute("attributeName") == valueRequired
            select el).FirstOrDefault();

(замените (string) другими типами, если необходимо)

Вот что-то похожее с использованием LINQ поверх XmlElement:

var parentNode = node.SelectNodes("./field1/field2[@attributeName]")
        .Cast<XmlElement>()
        .Where(el => el.GetAttribute("attributeName") == valueRequired)
        .FirstOrDefault();

Другой вариант (без any LINQ) - просто цикл вручную с помощью foreach.

1 голос
/ 02 декабря 2010

Ваш подход в порядке.Вы должны знать, что может быть в valueRequired.Если вы не доверяете его источнику, то очистите его, как с любыми недоверенными данными.

Также вам не нужно начинать относительный путь с ./, используйте просто:

field1/field2[@attributeName='{0}'] 
1 голос
/ 02 декабря 2010

Иногда нотация X-Path короче и понятнее, чем LINQ, в этом случае я бы предпочел использовать X-Path, а не LINQ. В вашем случае, поскольку вы уже знаете тип атрибута, должно быть легко решить, включать кавычки или нет.

Вам следует рассмотреть возможность использования элементов System.Xml.XPath следующими способами:

XmlReader xmlReader = XmlReader.Create(xmlFile); 
XElement xmlRoot = XElement.Load(xmlReader);  
xmlReader.Close();  
IEnumerable<XElement> nodes = 
   xmlRoot.XPathSelectElements(string.Format("./field1/field2[@attributeName='{0}']", valueRequired)); 
0 голосов
/ 04 декабря 2010

Хост движка XPath может создавать переменные , которые являются частью контекста.Примером хоста, предоставляющего эту возможность, является XSLT .

. В XSLT можно просто написать:

field1/field2[@attributeName=$valueRequired]"

Один из способов создания переменных и функций XPath в .NET - это использоватьXsltContext класс и его методы ResolveVariable() и ResolveFunction()

Еще одна вещь, которую следует помнить: никогда не вставляйте слепо вводимые пользователем данные в «каркас» выражения XPath.Помните о возможности XPath-инъекций .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...