2009-03-17 3 views
1

Как проверить, существует ли узел в файле XML, а также подсчитать количество узлов?Как проверить, существует ли узел в файле XML?

У меня есть один XML-файл для примера:

<Employee> 
    <Emp> 
    <Name id="1"> A  </Name> 
    <Name id="2"> C  </Name> 
    <Name id="3"> D  </Name> 
    </Emp> 
    </Employee> 
+5

Какой язык программирования вы хотите решить? Если вы не укажете это, кто-то проголосует за этот вопрос, поскольку он неполный. –

ответ

0

Есть по крайней мере 4 узлов здесь, при условии, что ваш </Emp> подобран отверстием <Emp> тег: <Emp>, <Name>, ID и строка " D " все будут представлены как узлы. Из вашего вопроса неясно, действительно ли вы хотите считать все из них. Я также не уверен, хотите ли вы определить существование определенного из них.

В конечном счете, XPath - это, вероятно, то, что вы ищете.

0

В качестве альтернативы XPath, много языков, которые имеют поддержку DOM XML позволит вам вызвать метод на XML-документа как:

GetAllNodesWithTagName(string tagname); 

Ваш код, чтобы увидеть, если он существует будет выглядеть примерно так (написано в псевдокоде):

int num_nodes = 0; 
string node_name = "Name"; // want to find all of the <Name> tags 
XMLNode [] nodes = GetNodesWithTagName(node_name); 
num_nodes = nodes.Length; 

XPath хорошо, но это лучше подходит для навигации легко документа XML в интересных и сложных способов. Этот код будет немного более простым, чем соответствующий код XPath.

6

С 2 XML LINQ в C#:

var employee = XElement.Load(someStream); 
var emp = employee.Element("Emp"); 
if(emp != null) 
{ 
    int count = emp.Elements("Name").Count(); 
} 
0

getElementsByTagName["tagname"] также метод DOM, который может быть использован, чтобы получить узел. Если узел не совпадает, метод с возвратом null.

1

Если вы программируете на Java, есть две связанные библиотеки, на которые вы должны обратить внимание.

JDOM - http://www.jdom.org/ DOM4J - http://www.dom4j.org/

Я смотрел на DOM4J 2.0 теперь, так как он получил поддержку дженериков, XPath, и теперь имеет некоторые более высокий уровень поддержки. Dom4j, я думаю, был раздвоен из прежнего jdom.

В любом из них вы можете читать XML из файла, URL, строки и т. Д., Анализировать его и проверять узлы всего на несколько строк кода.

2

Я предполагаю, что вы используете XSL для преобразования этого документа, тогда я бы предположил, что переменная даст лучшую функциональность. Вы бы использовать это:

<xsl:variable name="Name_Count" select="count(//Name)"/> 

Это даст вам число узлов Name и вы можете изменить, что все, что вы хотите. Очевидно, если он равен нулю, то их нет, иначе это счет.

1

LINQ отлично. Но на всякий случай вы застряли в системе с .NET 2.х вы могли бы сделать это "старый" (XPath) способ (где xmlFragment ваша строка XML выше):

XPathDocument doc = new XPathDocument(new StringReader(xmlFragment)); 
XPathNavigator n = doc.CreateNavigator().SelectSingleNode("//Name[@id='4']"); 
if(n==null){//Node does not exist} 
0
int nNodeExistCount = xmlOuput.GetElementsByTagName("NodeName").Count; 

if (nNodeExistCount>0) 
{ 
    Response.write(" The NodeName exists!"); 
} 
else 
{ 
    Response.write(" The NodeName does not exist!"); 
} 
0

Если вы используете преобразование XSLT просто trythis:

< XSL: выберите>

< XSL: когда тест = "// Служащий/Emp">

< - Узел существует ->

</XSL: когда>

< XSL: в противном случае>

< --Node не существует ->

</XSL: в противном случае >

</XSL: выберите>

2
XmlDocument _xmlDoc = new XmlDocument(); 

_xmlDoc.Load(Server.MapPath("~/XMLFile.xml")); 

XmlNode _node = _xmlDoc.SelectSingleNode("Employee/Emp"); 

if (_node != null) 

{ 

    XmlNodeList _nodeList = _node.SelectNodes("Name"); 

    Response.Write(_nodeList.Count); 
} 

else 

{ 

    Response.Write("Emp node doesnot exist"); 

} 
Смежные вопросы